Ho un QObject con più slot connessi a uno dei suoi segnali. Esiste un ordine in cui ciascuno di questi slot viene chiamato quando viene emesso il segnale?Ordine di slot richiesto QObject
risposta
In Qt v4.5 e precedenti: No, l'ordine non è definito come si può vedere in the documentation here:
Se diversi slot sono collegate a un segnale, gli slot saranno eseguiti uno dopo l'altro, in un ordine arbitrario, quando viene emesso il segnale.
Modifica: Dalla versione 4.6 in poi questo non è più vero. Ora gli slot funzioneranno nell'ordine in cui sono collegati. Il punto pertinente the current documentation:
Se più slot sono collegati ad un segnale, verranno eseguiti i slot uno dopo l'altro, nell'ordine in cui sono stati collegati, quando il segnale viene emesso
Sebbene l'ordine non sia definito, fino ad ora, in tutte le versioni Qt è stato ordinato connect()
, tranne quando viene utilizzato lo Qt::QueuedConnection
, nel qual caso, ovviamente, non è nemmeno garantito che uno o tutti gli slot siano stati eseguiti quando restituisce emit
. Affidarsi all'ordine è ancora scoraggiato, però.
Secondo Qt documentazione:
Se diversi slot sono collegati fra segnale, gli slot vengono eseguiti uno dopo l'altro, nell'ordine in cui sono stati collegati, quando il segnale è emessa.
Non sbagliato. Dipende dalla versione Qt. –
Basandosi sulla quale ordine gli slot verranno eseguiti è una cattiva, cattiva idea, in quanto sconfigge sia lo spirito delle/connessioni slot segnali e si lascia spalancata per un comportamento indesiderato se si fa qualsiasi tipo di connessioni programmatiche di segnali & slot.
- 1. Ordine di connessione segnale-slot
- 2. QVariant to QObject *
- 3. conversione inaccessibile in QObject
- 4. Errore con `QObject` sottoclasse e costruttore di copia:` QObject :: QObject (const QObject &) è private`
- 5. Come utilizzare QMetaMethod con QObject :: connect
- 6. QObject cloning
- 7. QObject :: deleteLater attraverso un QThread
- 8. QThread finished() collegato a deletelater di un QObject
- 9. QObject :: collegarsi: Impossibile coda argomenti di tipo 'int &'
- 10. Segnale C++ allo slot QML in Qt
- 11. blackberry 10 Inclusione irrisolta <QObject>
- 12. Utilizzo di segnali Qt e slot con ereditarietà multipla
- 13. È possibile organizzare QObject * su nullptr quando QObject viene distrutto?
- 14. Quanto pesa davvero QObject?
- 15. lettura QObject/scrittura
- 16. Perché utilizzare QObject :: setObjectName()?
- 17. Visualizza segnali e slot QT
- 18. È possibile disconnettere tutte le connessioni di QObject senza eliminarlo
- 19. QObject (QPlainTextEdit) e problemi di multithreading
- 20. Errore linker con segnale Qt/Esempio di slot
- 21. Perché QObject ha distrutto il segnale chiamato DOPO la distruzione?
- 22. Collegare QML segnale al C++ 11 slot di lambda (Qt 5)
- 23. App GUI Qt: avviso se QObject :: connect() non è riuscito?
- 24. qt slot in corso
- 25. Uso ng-richiesto vs richiesto
- 26. Impossibile chiamare lo slot o Q_INVOKABLE da QML nella sottoclasse di QQmlPropertyMap
- 27. segnali Qt e slot, fili, app.exec(), e query correlate
- 28. Tipo di argomento per segnale Qt e slot, i qualificatori di riferimento const sono importanti?
- 29. Come connettere lo slot PyQt dal thread in background al thread GUI
- 30. Sottoclasse di QObject, qRegisterMetaType e il costruttore di copie private
@Hossein La mia risposta è stata corretta fino alla versione 4.6 del QT. Se guardi la data della domanda (e la mia risposta), vedrai che è stata la risposta corretta quando è stata posta la domanda. Si noti che la risposta di Yaroslav fu pubblicata più di un anno dopo. – sepp2k
OK, scusa, non volevo sottovalutare il tuo post. Poiché questa domanda è apparsa come il primo risultato della ricerca Google che ho fatto, volevo impedire a ulteriori lettori di confondere. – Hossein
è necessario utilizzare Connessioni in coda affinché questo sia vero per diversi thread. Sto solo dicendo – smsware