2011-12-24 12 views
7

Recentemente ho riscontrato un problema con il mio codice causato da determinati comportamenti dipendenti dall'ordine di connessione dello slot di segnale in un particolare oggetto. Questo è un difetto di progettazione per me (le connessioni erano sempre pensate per essere dinamiche, quindi questo difetto era inevitabile), ma mi ha fatto riflettere.Ordine di connessione segnale-slot

È possibile riordinare le connessioni dello slot di segnale in un oggetto? E/o specificare l'"indice" di una connessione durante la creazione di uno?

Mi rendo conto che è possibile simulare questo effetto, distruggendo tutte le connessioni e ricreando in un nuovo ordine, ma non è questo che mi sto chiedendo. Non ho trovato nulla nell'API o nei documenti generali, quindi sospetto che la risposta sia no, ma ho pensato di doverlo chiedere comunque ...

risposta

10

Contrariamente a quanto seemed to be the past understanding, sono sorpreso di leggere un aggiornamento che (a almeno nelle versioni più recenti) Qt non ha lasciato l'ordine della scanalatura chiamante come definito:

Se diversi slot sono collegati ad un segnale, gli slot verrà eseguito uno dopo l'altro, nell'ordine in cui sono stati collegati, quando viene emesso il segnale.

http://doc.qt.io/qt-4.8/signalsandslots.html#signals

(Anche se si potrebbe obiettare che una frase in quella documento non è sufficiente a rappresentare una garanzia "forte" per tutte le versioni di Qt 4.X. passati e futuri.)

Non sembra esserci un'API per riordinare i segnali e gli slot. Anche se ci fossero, mi sento di fare affidamento sull'ordine non è una buona idea. Suggerirei di ripensare il design.

Una cosa che potresti indagare sarebbe fare in modo che le tue slot mettano in coda le loro azioni invece di agire direttamente. Poi, quando tutti gli slot erano stati chiamati, avresti elaborato quella coda ... prendendo in considerazione alcuni attributi prioritari.

+0

Concordato. Come ho notato nella mia domanda, riconosco che si tratta di difetto di progettazione, ma gli sviluppatori API dovrebbero darci tutto ciò di cui abbiamo bisogno per uscire da situazioni difficili, che siano di classe o meno. Avrei pensato che questo sarebbe stato ovvio, ma a giudicare dalla mancanza di averne persino interrogato su internet, dimostra che ho chiaramente sbagliato lì! – cmannett85

+0

Proprio come ci sono due tipi di libertà politica ("libertà di" e "libertà da"), ci sono due tipi di potenzialità nella progettazione delle API. In questo caso penso che sia giusto non offrire la possibilità di riordinare i segnali, sembra solo incongruente con l'affermazione che esiste un ordine contrattuale. * shrug * http://hostilefork.com/2005/07/04/freedom-to-and-freedom-from/ – HostileFork

0

QObject memorizza internamente le connessioni come un elenco. È semplice utilizzare l'intestazione <private/qobject_p.h> per acquisire un blocco nell'elenco delle connessioni del mittente e riordinarne le voci. Un'API pubblica renderebbe questo dettaglio fisso per la durata di ciascuna revisione Qt, e questo è stato considerato troppo limitante.