2010-09-20 4 views
14

est-il un moyen de voir quels signaux sont lancés, et s'il y a une fente qui y sont connectés? Idéalement, nous aimerions voir tous les signaux, pas seulement ceux d'une classe ou méthode particulière; par exemple. QSignalSpy nous permet seulement de suivre des signaux spécifiques d'instances spécifiques.signaux de débogage Qt, machines à sous et les connexions

Dans notre application, nous avons vu des problèmes de performance en raison d'un signal étant émis deux fois de différents composants. En fin de compte, il s'est avéré qu'il y avait une deuxième instance d'une classe qui aurait dû être là qu'une seule fois. Le fait de savoir quels signaux sont émis aide précisément à le déboguer.

Les signaux sont appelés par QMetaObject::invoke*, j'espérais trouver quelque chose à accrocher dans, mais je trouve rien d'évident.

+0

double possible [Comment intercepter tous les signaux émis par un événement donné dans l'intervalle QT?] (Http://stackoverflow.com/questions/2072013/how-to-intercept-all-signals-emitted-by-a- given-event-in-qt) – exilit

+0

Si vous voulez avoir juste une instance de la classe, pourquoi n'avez-vous pas utilisé le pattern singleton pour contrôler le nombre d'objets? – Afshin

Répondre

1

QSignalSpy pourrait vous aider.

De documents,

La classe QSignalSpy permet introspection des signaux emission.QSignalSpy peut se connecter à tout signal d'un objet quelconque et enregistre son émission.

Les docs a des exemples trop ..

+1

Je suis au courant de signal espion, désolé de ne pas le mentionner. L'inconvénient, c'est qu'il ne me permet pas de voir * tous * les signaux émis, juste des signatures de signaux spécifiques d'une seule classe ou instance. – Ivo

+0

@ Ivo, je ne suis pas certain qu'il y ait quelque chose qui répertorie tous les signaux émis mais oui 'QSignalMapper' est de suivre les signaux de l'instance spécifiée .. – liaK

+0

Qt maintient une liste de signaux interne, qui est une structure contenant au moins la chaîne contenant le nom et la signature du signal. C'est ce que j'ai appris en regardant le code. Cependant, malheureusement, cela est enterré très profondément dans Qt. – Ivo

5

(disclaimer, je travaille pour KDAB): KDAB de GammaRay tool peut vous montrer des objets et des connexions à l'exécution, sans nécessiter de modifications de la source. Il inspecte les tables de méta-objets et effectue des hooks d'injection de code pour que cela fonctionne.

+1

J'ai construit GammaRay à partir du repo git et ne pouvais pas trouver où les connexions sont affichées (construit avec Qt 5.7); le panneau des signaux a juste montré des tics d'émission. Le mieux que je pouvais faire comme alternative était de supprimer la vérification de QT_DEBUG dans qobject.cpp et d'appeler dumpObjectInfo() pour voir toutes les connexions signal/slot de l'objet, sinon il n'imprimerait rien pour ma version de Qt -debug-and-release configurée . –

Questions connexes