2010-09-20 5 views
14

C'è un modo per vedere quali segnali vengono attivati ​​e se c'è uno slot collegato ad essi? Idealmente, vorremmo vedere tutti i segnali, non solo quelli di una particolare classe o metodo; per esempio. QSignalSpy ci consente solo di tracciare segnali specifici di istanze specifiche.Debug Segnali, slot e connessioni Qt

Nella nostra applicazione, abbiamo riscontrato problemi di prestazioni a causa di un segnale emesso due volte da diversi componenti. Alla fine, si è scoperto che c'era una seconda istanza di una classe che avrebbe dovuto essere lì solo una volta. Sapere quali segnali vengono emessi aiuta esattamente a eseguire il debug di questo.

I segnali vengono chiamati tramite QMetaObject::invoke*, speravo di trovare qualcosa da collegare, ma non ho trovato nulla di ovvio.

+0

possibile duplicato di [Come intercettare TUTTI i segnali emessi da un determinato evento in QT?] (Http://stackoverflow.com/questions/2072013/how-to-intercept-all-signals-emitted-by-a- given-event-in-qt) – exilit

+0

Se si desidera avere una sola istanza della classe, perché non si è utilizzato il modello singleton per controllare il numero di oggetti? – Afshin

risposta

1

QSignalSpy potrebbe aiutarvi.

Da documenti,

La classe QSignalSpy consente introspezione del segnale emission.QSignalSpy può collegarsi a qualsiasi segnale di qualsiasi oggetto e registra la sua emissione.

La documentazione deve esempi troppo ..

+1

Sono consapevole della spia del segnale, mi dispiace di non averlo menzionato. Il rovescio della medaglia, è che non mi permette di vedere * tutti * i segnali emessi, solo specifiche firme di segnale di una singola classe o istanza. – Ivo

+0

@Ivo, non sono sicuro se c'è qualcosa che elenca tutti i segnali emessi ma sì 'QSignalMapper' è per tracciare i segnali dall'istanza specificata. – liaK

+0

Qt mantiene una lista di segnali internamente, che è una struttura che contiene almeno la stringa contenente il nome del segnale e la firma. Tutto ciò che ho raccolto dal guardare il codice. Tuttavia, sfortunatamente, questo è sepolto molto in profondità in Qt. – Ivo

5

(dichiarazione di non responsabilità, Lavoro per KDAB): KDAB di GammaRay tool in grado di mostrare gli oggetti e le connessioni in fase di esecuzione, senza dover apportare modifiche di origine. Ispeziona le tabelle dei metaoggetti e fa alcuni hook di iniezione del codice per farlo funzionare.

+1

Ho costruito GammaRay dal repository git e non sono riuscito a trovare le connessioni mostrate (create con Qt 5.7); il pannello Segnali ha appena mostrato i tic di emissione. Il meglio che potevo fare come alternativa era rimuovere il controllo di QT_DEBUG in qobject.cpp e chiamare dumpObjectInfo() per vedere tutte le connessioni segnale/slot dell'oggetto, altrimenti non stampava nulla per il mio build Qt -debug-and-release configurato . –