Después de 18 meses ... comencé con comentarios en la respuesta de @ Mat, y me estaba quedando sin espacio rápidamente. De ahí la respuesta.
IMO emit
no es azúcar sintáctico ni una palabra clave simple en el sentido de que
- Genera código (como explica @Mat arriba),
- Ayuda al
connect
mecanismo a reconocer que de hecho es un 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 sincrónica o asincrónica, 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 simple llamada de función. Creo que se deriva del patrón del observador. También hay una gran diferencia entre ay signal
a slot
: no es necesario implementar una señal , ¡mientras que una ranura debe serlo !
Estás caminando por la calle y ves una casa en llamas (una señal). Usted marca el 911 ( conecte la señal de incendio con la ranura de respuesta del 911 ). La señal solo fue emitida , mientras que la ranura fue implementada por el departamento de bomberos. Puede ser impreciso, pero entiendes la idea. Veamos el ejemplo de OP.
Algún objeto de backend sabe cuánto se ha avanzado. Entonces podría simplemente emit progressNotification(...)
señalar. Depende de la clase que muestra la barra de progreso real, 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 (normalmente una especie de widget), que consta de un objeto de vista y un objeto de cálculo de datos (ambos son QObjects
), que 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 concentrarme en diseñar una arquitectura muy limpia para mi aplicación. No siempre, pero muchas veces, encuentro que simplemente emito señales pero implemento ranuras .
Si es posible usar / llamar a un método de señal sin siquiera emitirlo , entonces necesariamente implica que nunca necesitó esa función como señal en primer lugar.
emit
no es necesario. Sin embargo, es extraño que haya aprendidoemit
mucho después de llamar a las señales directamente, ya que el sistema de ranura de señal es una de las primeras cosas que debe aprender sobre Qt.