2009-10-14 10 views
6

Je sais que je peux utiliser QSignalMapper pour appeler un emplacement avec différents paramètres basés sur la connexion. Ce que je veux accomplir est un peu différent.Signaux de carte Qt basés sur la valeur du paramètre

Nous utilisons des plugins dans notre application et différents plugins sont responsables de différents types d'objets. Nous connectons plusieurs slots, chacun implémenté dans un plugin différent, à un signal émis par l'application principale. L'un des paramètres du signal est un QString indiquant le type d'objet associé au signal. Actuellement, nous vérifions ce paramètre dans les slots et poursuivons si le type est géré par le plugin. Cela a un inconvénient, chaque plugin fait cette vérification et je veux éviter cela si possible. Je veux connecter tous les slots au même signal, et quand le signal est émis, seul le slot approprié est appelé en fonction de la valeur de l'argument QString, un peu comme un QSignalMapper mais de manière différente.

Y a-t-il un mécanisme intégré pour cela? Si non, des idées sur la façon dont je peux y parvenir?

Merci d'avance.

Répondre

3

Je ne pense pas qu'il y ait un élément pour cela, mais vous pouvez créer votre propre mappeur signal comme celui-ci:

  1. créer un code composant MySignalMapper
  2. une méthode addSourceSignal pour régler le signal de la principale
  3. codez une méthode addDestinationSlot qui prend une paire QString/slot et mappe la chaîne sur l'emplacement.
  4. Dans votre composant, connectez le signal source à un emplacement personnalisé distribué selon la valeur qstring. Vous pouvez appeler un emplacement avec QMetaObject :: invokeMethod.
0

Vous pouvez limiter les valeurs autorisées de la chaîne "type" à des noms de fonction C++ valides uniquement. Forcer les plugins à nommer leurs emplacements en fonction des types qu'ils gèrent, puis pour chaque plugin, essayez simplement de connecter les slots nommés de manière appropriée. En d'autres termes, vous pouvez faire QMetaObject::connectSlotsByName, sauf implémenter votre propre convention de nommage.