FAQ Qt
FAQ QtConsultez toutes les FAQ
Nombre d'auteurs : 26, nombre de questions : 298, dernière mise à jour : 15 juin 2021
Il est intéressant de savoir faire ceci dans la mesure où vous désirez utiliser des classes écrites en C++ pur avec les mécanismes Qt. Par exemple, une couche métier utilisant le mécanisme de boost.signals comme implémentation du pattern observateur, que vous désirez connecter à la couche IHM écrite à l'aide de Qt.
- si vous intégrez Qt et boost.signals dans un même fichier (requis pour permettre l'appel d'une fonction standard depuis un signal Qt), il est impératif d'inclure les en-têtes boost en premier (sinon, vous obtiendrez des erreurs de compilation dues à Qt utilisant un #define sur signals) ;
- un prérequis à l'utilisation de sender() dans un slot pour connaître l'origine de l'appel est la vérification de la validité du QObject* retourné. On préfèrera généralement éviter d'utiliser ce paramètre.
- un slot peut être appelé comme une fonction normale (et, par conséquent, il n'y a pas d'objet appelant généré par le système de métaobjets Qt) ;
- un slot est appelé comme une fonction normale lors d'un appel par boost.signals (voir point précédent).
- utilisation d'un boost.signal connecté à un slot Qt ;
- utilisation d'un boost.signal connecté à un signal Qt ;
- utilisation d'un signal Qt connecté à une (des) fonction(s) C++ standard par le biais de boost.signal.
Les aspects les plus intéressants de l'implémentation sont illustrés par des portions de code dans les réponses aux questions suivantes.
Lien : Comment utiliser un boost.signal connecté à un slot Qt ?
Lien : Comment utiliser un boost.signal connecté à un signal Qt ?
Lien : Comment utiliser un signal Qt connecté à une fonction standard par boost.signal ?
Un signal, du point de vue de Qt, n'est qu'une méthode standard, le mot clé signals étant redéfini par Qt comme protected. Il est donc nécessaire de fournir une méthode pour déclencher ce signal avec le(s) paramètre(s) voulu(s). Il y a deux approches possibles : la première consiste à ajouter une méthode à votre classe Qt, la seconde à utiliser une classe de pont.
Bien que plus verbeuse, la seconde méthode permet de découpler réellement la couche utilisant Qt de la couche sans Qt en "intercalant" une couche servant d'adaptateur.
Ici, ce sera la première méthode qui sera illustrée.
D'une connexion interne :
Dans QtClass::qtSlot(), x=42
Lien : Comment combiner les signaux de Boost
(boost.signals) aux signaux/slots de Qt ?
Lien : Comment utiliser un boost.signal connecté à un slot Qt ?
Lien : Comment utiliser un boost.signal connecté à un signal Qt ?
Un slot, du point de vue de Qt, est en réalité une fonction standard à laquelle peuvent être associées les informations de l'objet appelant, si ledit slot est appelé depuis un signal Qt.
Envoyeur inconnu :
Dans QtClass::qtSlot(), x=3.14
Lien : Comment combiner les signaux de Boost
(boost.signals) aux signaux/slots de Qt ?
Lien : Comment utiliser un boost.signal connecté à un signal Qt ?
Lien : Comment utiliser un signal Qt connecté à une fonction standard par boost.signal ?
- qu'un signal Qt est une méthode protégée ;
- que le corps d'un signal Qt va associer les informations sur l'objet émetteur (dans le but de permettre l'utilisation de la méthode sender() dans le slot) ;
- que nous ne pouvons passer de fonctions standard à un signal Qt.
Nous allons donc mettre en place ici une méthode impliquant la création d'une classe servant d'adaptateur entre les deux paradigmes (signaux Qt / boost.signals).
Dans NonQtClass::normalFunction(), x=121
Dans NonQtClass::displaySquareRoot(), sqrt(x)=11
Lien : Comment combiner les signaux de Boost
(boost.signals) aux signaux/slots de Qt ?
Lien : Comment utiliser un boost.signal connecté à un slot Qt ?
Lien : Comment utiliser un boost.signal connecté à un signal Qt ?