Dopo 18 mesi ... ho iniziato con i commenti sotto la risposta di @ Mat, e stavo finendo rapidamente lo spazio. Così la risposta.
IMO emit
non è né zucchero sintattico né una semplice parola chiave nel senso che
- Genera codice (come spiegato da @Mat sopra),
- Aiuta il
connect
meccanismo a riconoscere che effettivamente è un signal
, e
- Rende il tuo segnale parte di un sistema "più grande", dove segnali e risposte (slot) possono essere eseguiti in modo sincrono o asincrono, o accodati, a seconda di dove e come il segnale è stato emesso. Questa è una caratteristica estremamente utile del sistema segnale / slot.
L'intero sistema segnale / slot è un linguaggio diverso da una semplice chiamata di funzione. Credo che derivi dal modello dell'osservatore. C'è anche una grande differenza tra a signal
e a slot
: un segnale non deve essere implementato, mentre deve esserlo uno slot !
Stai camminando per strada e vedi una casa in fiamme (un segnale). Componi il 911 ( collega il segnale di fuoco con lo slot di risposta 911 ). Il segnale è stato solo emesso , mentre lo slot è stato realizzato dai vigili del fuoco. Può essere impreciso, ma hai un'idea. Diamo un'occhiata all'esempio di OP.
Alcuni oggetti di backend sanno quanti progressi sono stati fatti. Quindi potrebbe semplicemente emit progressNotification(...)
segnalare. Spetta alla classe che visualizza la barra di avanzamento effettiva, raccogliere questo segnale ed eseguirlo. Ma come si collega la vista a questo segnale? Benvenuto nel sistema di segnali / slot di Qt. Si può ora concepire una classe manager (tipicamente una sorta di widget), che consiste in un oggetto di visualizzazione e un oggetto di calcolo dei dati (entrambi essendo QObjects
), può eseguire connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
.
Non entriamo negli aspetti progettuali della classe manager, ma basti dire che è qui che brilla il sistema segnale / slot. Posso concentrarmi sulla progettazione di un'architettura molto pulita per la mia applicazione. Non sempre, ma spesso, trovo che emetto semplicemente segnali ma implemento slot .
Se è possibile utilizzare / chiamare un metodo di segnale senza mai emetterlo , significa necessariamente che non hai mai avuto bisogno di quella funzione come segnale in primo luogo.
emit
non è necessario. È strano, però, che tu abbia imparatoemit
molto dopo aver chiamato i segnali direttamente, poiché il sistema di slot di segnale è una delle prime cose da imparare su Qt.