Après 18 mois ... j'ai commencé par des commentaires sous la réponse de @ Mat, et je manquais rapidement de place. Ainsi la réponse.
IMO emit
n'est ni un sucre syntaxique ni un simple mot-clé dans le sens où
- Il génère du code (comme expliqué par @Mat ci-dessus),
- Cela aide le
connect
mécanisme à reconnaître qu'il s'agit effectivement d'un signal
, et
- Cela fait de votre signal une partie d'un système "plus grand", où les signaux et les réponses (slots) peuvent être exécutés de manière synchrone ou asynchrone, ou mis en file d'attente, selon l'endroit et la manière dont le signal a été émis. C'est une fonction extrêmement utile du système signal / slot.
L'ensemble du système signal / slot est un idiome différent d'un simple appel de fonction. Je crois que cela découle du modèle d'observateur. Il y a aussi une différence majeure entre a signal
et a slot
: un signal n'a pas à être implémenté, alors qu'un slot doit l'être !
Vous marchez dans la rue et voyez une maison en feu (un signal). Vous composez le 911 ( connectez le signal d'incendie à l'emplacement de réponse 911 ). Le signal n'a été émis que tandis que le créneau a été mis en œuvre par les pompiers. Peut-être imprécis, mais vous voyez l'idée. Regardons l'exemple de OP.
Certains objets backend savent combien de progrès ont été réalisés. Donc, cela pourrait simplement emit progressNotification(...)
signaler. C'est à la classe qui affiche la barre de progression réelle, de capter ce signal et de l'exécuter. Mais comment la vue se connecte-t-elle à ce signal? Bienvenue dans le système signal / slot de Qt. On peut maintenant concevoir une classe de gestionnaire (typiquement un widget de sortes), qui se compose d'un objet de vue et d'un objet de calcul de données (les deux étant QObjects
), peut fonctionner connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
.
N'entrons pas dans les aspects de conception de la classe de gestionnaire, mais il suffit de dire que c'est là que le système signal / slot brille. Je peux me concentrer sur la conception d'une architecture très propre pour mon application. Pas toujours, mais souvent, je trouve que j'émets simplement des signaux mais que j'implémente des slots .
S'il est possible d'utiliser / d'appeler une méthode de signal sans jamais l'émettre , cela implique nécessairement que vous n'avez jamais eu besoin de cette fonction comme signal en premier lieu.
emit
n'est pas nécessaire. C'est étrange cependant que vous ayez apprisemit
longtemps après avoir appelé directement les signaux, car le système de créneaux de signaux est l'une des premières choses à apprendre sur Qt.