Déterminer les signaux connectés à une fente donnée dans Qt

je me suis injecté moi-même dans une application Qt, et j'essaie de comprendre à quels signaux un slot donné est connecté, mais je ne trouve aucune information sur le faire. Est-il un mécanisme pour le faire sortir de la boîte? Si oui, est-ce exposé à QtScript? (Sinon, je peux l'envelopper assez facilement.)

s'il n'existe pas de mécanisme de ce genre, quelle serait la meilleure façon de l'ajouter? Je ne peux pas manipuler L'application existante en dehors de l'accrochage simple, mais je pourrais accrocher QObject:: connect et stocker les connexions moi-même, mais je ne suis pas sûr que ce soit la meilleure façon de le faire.

25
demandé sur Robert Harvey 2010-05-03 05:10:58
la source

3 ответов

je pense que Qt stocke les fentes d'un signal est connecté, de sorte que lorsque vous l'émettre tous les récepteurs sont appelés, par conséquent, vous pouvez accéder à la liste des récepteurs:

Pour des fins de débogage, vous avez:

void QObject:: dumpObjectInfo ()

décharge des informations sur le signal connexions, etc. pour cet objet la sortie de débogage.

Cette fonction est utile pour le débogage, mais ne fait rien si la bibliothèque a être compilé en mode release (c'est à dire sans débogage des informations).

Et la liste de slots d'un signal est connecté:

int QObject::récepteurs (const char * signal ) const [protégés]

Retourne le nombre de récepteurs connecté au signal.

le metaObject () vous donne la méthode QMetaMethod pour la fente, mais il n'a aucune information sur ses connexions.

cependant, si vous connaissez les objets, vous pouvez passer en revue tous les signaux (en utilisant l'objet meta, en testant le type de méthode pour le signal) et construire un index inverse avec les récepteurs de slots() vous donne.

26
répondu duncan 2010-05-03 05:45:42
la source

il n'y a aucun moyen d'itérer en toute sécurité la liste des connections signal-slot sans tenir les Mutex/sémaphores internes de Qt. Les signaux et les slots peuvent aller et venir à tout moment, donc au mieux, vous obtiendrez une liste qui n'est pas garanti d'être correcte et donc inutile.

Quel que soit l'accrochage-vous dans QObject::connect est en soi insuffisant. Les données que vous obtenez à partir de tels crochets souffriront de ce qui suit:

  1. Vous pouvez avoir des pointeurs vers des objets qui sont déjà supprimés par le temps que vous essayez d'y accéder. Vous pouvez atténuer cela en utilisant QPointer, mais cela ne fonctionne que pour les objets qui vivent dans le thread où vous exécutez votre code. Vous devez injecter votre objet dans d'autres threads pour y collecter des listes d'objets.

  2. vous avez peut-être des relations qui n'existent plus. Même l'accrochage QObject::disconnect serait insuffisante, puisque les connexions sont supprimés lorsque les objets cessent d'exister.

le problème auquel vous faites face est assez complexe, et toute solution robuste ne se limiterait pas à "accrocher" QObject::connect.

Hélas, vous n'avez pas dit pourquoi vous avez besoin de la liste des signaux qui s'attachent à un logement. Quel est l'objectif?

7
répondu Kuba Ober 2014-01-07 21:23:09
la source

après avoir fouillé dans la base de code Qt et la documentation (j'ai eu beaucoup de conseils utiles d'ici et d'ailleurs), J'ai fini par m'installer sur l'accrochage de QObject::connect (la surcharge statique). Pourquoi? Bien, les autres solutions exigent que vous sachiez quels objets fournissent les signaux, creusez dans des champs privés, ou devez avoir une construction de débogage de Qt. En fin de compte, accrocher QObject::connect vous donne tout ce qui est connecté dans l'application, et vous pouvez trivialement revenir aux slots.

3
répondu Cody Brocious 2010-05-03 12:40:45
la source

Autres questions sur