Nach 18 Monaten ... begann ich mit Kommentaren unter @ Mats Antwort und hatte schnell keinen Platz mehr. Also die Antwort.
IMO emit
ist weder syntaktischer Zucker noch ein einfaches Schlüsselwort in dem Sinne, dass
- Es generiert Code (wie oben von @Mat erläutert).
- Es hilft dem
connect
Mechanismus zu erkennen, dass es sich tatsächlich um ein signal
und handelt
- Es macht Ihr Signal zu einem Teil eines "größeren" Systems, in dem Signale und Antworten (Slots) synchron oder asynchron ausgeführt oder in eine Warteschlange gestellt werden können, je nachdem, wo und wie das Signal gesendet wurde. Dies ist eine äußerst nützliche Funktion des Signal- / Steckplatzsystems.
Das gesamte Signal- / Slot-System ist eine andere Sprache als ein einfacher Funktionsaufruf. Ich glaube, es ergibt sich aus dem Beobachtermuster. Es gibt auch einen großen Unterschied zwischen a signal
und a slot
: Ein Signal muss nicht implementiert werden, während ein Slot sein muss !
Sie gehen die Straße entlang und sehen ein brennendes Haus (ein Signal). Sie wählen 911 ( verbinden Sie das Feuersignal mit dem 911-Antwortsteckplatz ). Das Signal wurde nur ausgesendet , während der Slot von der Feuerwehr implementiert wurde. Mag ungenau sein, aber Sie bekommen die Idee. Schauen wir uns das Beispiel von OP an.
Einige Backend-Objekte wissen, wie viel Fortschritt erzielt wurde. Es könnte also einfach emit progressNotification(...)
signalisieren. Es liegt an der Klasse, die den tatsächlichen Fortschrittsbalken anzeigt, dieses Signal aufzunehmen und darauf auszuführen. Aber wie verbindet sich die Ansicht mit diesem Signal? Willkommen beim Signal- / Slot-System von Qt. Man kann sich jetzt eine Manager-Klasse vorstellen (typischerweise eine Art Widget), die aus einem Ansichtsobjekt und einem Datenberechnungsobjekt (beide sind QObjects
) besteht connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
.
Lassen Sie uns nicht auf die Designaspekte der Manager-Klasse eingehen, aber es genügt zu sagen, dass hier das Signal- / Slot-System glänzt. Ich kann mich darauf konzentrieren, eine sehr saubere Architektur für meine Anwendung zu entwerfen. Nicht immer, aber oft stelle ich fest, dass ich nur Signale aussende, aber Slots implementiere .
Wenn es möglich ist, eine Signalmethode zu verwenden / aufzurufen, ohne sie jemals auszusenden , bedeutet dies zwangsläufig, dass Sie diese Funktion überhaupt nicht als Signal benötigt haben.
emit
wird nicht benötigt. Es ist jedoch seltsam, dass Sieemit
lange nach dem direkten Aufrufen von Signalen davon erfahren haben , da das Signal-Slot-System eines der ersten Dinge ist, die Sie über Qt lernen sollten.