Después de 18 meses ... Comencé con comentarios con la respuesta de @ Mat y me estaba quedando sin respuesta de habitación rápidamente. Por lo tanto, la respuesta.
OMI emit
es ni azúcar sintáctico ni una palabra clave simple en el sentido de que
- Genera código (según lo explicado por @Mat arriba),
- Ayuda a que el mecanismo de
connect
reconocen que, efectivamente, se trata de una signal
y
- Hace que su señal sea parte de un sistema "más grande", donde las señales y respuestas (ranuras) se pueden ejecutar de forma síncrona o sincronizada, o en cola, dependiendo de dónde y cómo se emitió la señal. Esta es una característica extremadamente útil del sistema de señal/ranura.
Todo el sistema de señal/ranura es un idioma diferente al de una llamada de función simple. Yo creo que se deriva del patrón del observador. También existe una gran diferencia entre signal
y slot
: una señal no tiene que implementarse, mientras que una ranura debe ser.
Está caminando por la calle y ve una casa en llamas (una señal). Marque 911 (conecte la señal de fuego con la ranura de respuesta 911). La señal fue solo emitió, mientras que la ranura se implementó por el departamento de bomberos. Puede ser impreciso, pero entiendes la idea. Miremos el ejemplo de OP.
Algún objeto de back-end sabe cuánto progreso se ha realizado. Por lo tanto, podría simplemente la señal emit progressNotification(...)
. Depende de la clase que muestre la barra de progreso real, para recoger esta señal y ejecutarla. Pero, ¿cómo se conecta la vista a esta señal? Bienvenido al sistema de señal/ranura de Qt. Ahora se puede concebir una clase de administrador (generalmente un artilugio de géneros), que consiste en un objeto de vista y un objeto de cálculo de datos (ambos siendo QObjects
), puede realizar connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
.
No entremos en los aspectos de diseño de la clase de administrador, pero basta con decir que aquí es donde brilla el sistema de señal/ranura. Puedo centrarme en diseñar una arquitectura muy limpia para mi aplicación. No siempre, pero muchas veces, me parece que I simplemente emiten señales pero implementan las ranuras.
Si es posible utilizar/llamar a un método de señal sin tener que emitirla, entonces necesariamente implica que que nunca necesitamos que funcionan como una señal en el primer lugar.
+1 Nunca se supo que 'emit' no es necesario. Sin embargo, es extraño que hayas aprendido a 'emit' mucho después de llamar directamente a las señales, ya que el sistema de ranura de señal es una de las primeras cosas que se aprende sobre Qt. –