Dopo 18 mesi ... Ho iniziato con i commenti sotto la risposta di @ Mat e stavo finendo di stanza rapidamente. Quindi la risposta.
IMO emit
è né zucchero sintattico né una semplice parola chiave, nel senso che
- Si genera il codice (come spiegato da @Mat sopra),
- Aiuta il meccanismo
connect
riconoscono che effettivamente è un signal
e
- Rende il segnale parte di un sistema "più grande", in cui segnali e risposte (slot) possono essere eseguiti in modo sincrono o asincrono, o in coda, a seconda di dove e come il segnale è stato emesso. Questa è una caratteristica estremamente utile del sistema segnale/slot.
L'intero sistema di segnale/slot è un idioma diverso da una semplice chiamata di funzione. Credo che provenga dal modello di osservatore. C'è anche una grande differenza tra uno signal
e uno slot
: un segnale non ha da implementare, mentre uno slot deve essere!
Stai camminando per la strada e vedi una casa in fiamme (un segnale). Componi 911 (collega il segnale di fuoco con lo slot di risposta 911). Il segnale era emesso solo, mentre lo slot è stato implementato dai vigili del fuoco. Può essere impreciso, ma tu hai l'idea. Diamo un'occhiata all'esempio di OP.
Alcuni oggetti di back-end sanno quanti progressi sono stati fatti. Quindi potrebbe semplicemente il segnale emit progressNotification(...)
. Spetta alla classe che visualizza la barra di avanzamento attuale, prendere questo segnale ed eseguirlo. Ma come si collega la vista a questo segnale? Benvenuti nel sistema di segnale/slot Qt. Si può ora concepire una classe manager (tipicamente un widget di ordinamento), che consiste in un oggetto vista e un oggetto di calcolo dati (entrambi essendo QObjects
), può eseguire .
Non entriamo negli aspetti di progettazione della classe manager, ma è sufficiente dire che questo è il punto in cui il sistema segnale/slot brilla. Posso concentrarmi sulla progettazione di un'architettura molto pulita per la mia applicazione. Non sempre, ma spesso, trovo che I emetta solo segnali ma implementa gli slot.
Se è possibile utilizzare/chiamare un metodo di segnale senza mai emetterla, allora implica necessariamente che non hai mai avuto bisogno che funzionano come un segnale in primo luogo.
+1 Non si sa mai che "emettere" non è necessario. È strano, però, che tu abbia imparato a conoscere "emit" molto tempo dopo aver chiamato i segnali direttamente, poiché il sistema di slot del segnale è una delle prime cose da imparare su Qt. –