2010-09-20 9 views
14

Gibt es eine Möglichkeit zu sehen, welche Signale ausgelöst werden, und ob ein Steckplatz mit ihnen verbunden ist? Idealerweise würden wir gerne alle Signale sehen, nicht nur die einer bestimmten Klasse oder Methode; z.B. QSignalSpy erlaubt uns nur bestimmte Signale bestimmter Instanzen zu verfolgen.Debug Qt-Signale, Steckplätze und Verbindungen

In unserer Anwendung traten Leistungsprobleme auf, da ein Signal von verschiedenen Komponenten zweimal ausgegeben wurde. Am Ende stellte sich heraus, dass es eine zweite Instanz einer Klasse gab, die nur einmal dort gewesen sein sollte. Zu wissen, welche Signale genau ausgegeben werden, hilft beim Debuggen.

Signale werden über QMetaObject::invoke* aufgerufen, ich hatte gehofft, dort etwas zu finden, aber ich fand nichts Offensichtliches.

+0

mögliche Duplikate von [Wie alle Signale von einem bestimmten Ereignis in QT abgefangen werden?] (Http://stackoverflow.com/questions/2072013/how-to-intercept-all-signals-emitted-by-a- given-event-in-qt) – exilit

+0

Wenn Sie nur eine Instanz der Klasse haben möchten, warum haben Sie das Singleton-Muster nicht verwendet, um die Anzahl der Objekte zu steuern? – Afshin

Antwort

1

QSignalSpy könnte Ihnen helfen.

Aus-Dokumente,

Die QSignalSpy Klasse ermöglicht Selbstbeobachtung von Signal emission.QSignalSpy auf jedes Signal eines beliebigen Objekts verbinden und zeichnet seine Emission.

Die docs hat auch Beispiele ..

+1

Ich bin mir bewusst, Signal-Spion, tut mir leid, dass nicht zu erwähnen. Der Nachteil ist, dass es mir nicht erlaubt, * alle * ausgesendeten Signale zu sehen, nur bestimmte Signaturen einer einzelnen Klasse oder Instanz. – Ivo

+0

@Ivo, ich bin mir nicht sicher, ob es irgendetwas gibt, das alle ausgegebenen Signale auflistet, aber ja 'QSignalMapper' ist, die Signale von der spezifizierten Instanz zu verfolgen. – liaK

+0

Qt unterhält intern eine Liste von Signalen, die eine Struktur ist, die mindestens enthält die Zeichenfolge, die den Signalnamen und die Signatur enthält. So viel habe ich beim Betrachten des Codes gesehen. Leider ist dies in Qt sehr tief vergraben. – Ivo

5

(Disclaimer, ich arbeite für KDAB): KDAB der GammaRay tool können Sie Objekte und Verbindungen zur Laufzeit zeigen, ohne Quelle Änderungen zu erfordern. Es inspiziert die Meta-Objekttabellen und führt einige Codeinjektions-Hooks aus, um dies zu erreichen.

+1

Ich baute GammaRay aus dem Git Repo und konnte nicht finden, wo Verbindungen angezeigt werden (gebaut mit Qt 5.7); Das Signals-Panel zeigte nur Emissions-Tics. Das Beste, was ich als Alternative tun konnte, war, die Prüfung auf QT_DEBUG in qobject.cpp zu entfernen und dumpObjectInfo() aufzurufen, um alle Signal-/Slot-Verbindungen des Objekts zu sehen, sonst nichts für mein -debug-und-release-konfiguriertes Qt-Build . –