Gestion des signaux/slots dans une application Qt

FondamentalObjet Qt

Un objet Qt est un objet qui hérite de QObject.

Les signaux/slots

Qt fournit un moyen formidable pour communiquer entre les objets Qt : les signaux et les slots.

DéfinitionSignal Qt

C'est un événement émis par un objet grâce au mot clef emit. En fait la description d'un signal Qt est similaire à celle d'une méthode de classe. Il est même possible de joindre au signal des paramètres.

L'émission d'un signal n'a pas de destinataire. Il doit être "capté" par l'objet en ayant besoin.

Les signaux ne permettent pas de faire du multitâche, mais seulement de provoquer des actions au moment de l'événement. Les objets sont "réveillés" à l'arrivée d'un signal les concernant. Cela peut donner toutefois l'impression d'un fonctionnement parallèle.

Figure 1 : Exemple de signal/slot

Remarques concernant la figure 1 :

  • l'objet A a défini dans sa classe un signal somebodyClicked(QString who). Tout comme private, protected et public, il existe aussi une section signals dans les objets Qt servant à définir les signaux émis par l'objet.

  • Ce signal est émis comme un appel de fonction mais précédé du mot clef emit.

  • Ce signal véhicule en plus une information de type QString (Classe Qt de gestion d'une chaîne de caractères).

Attentionsignal (Qt) et signal (IPC)

Ne pas confondre les signaux Qt et les signaux du système Linux. Dans cette formation, nous ne parlerons que des signaux Qt sauf si c'est précisé.

DéfinitionSlot Qt

C'est la méthode d'un objet Qt qui prendra en charge le travail à effectuer en cas de réception du signal. Il est pour cela nécessaire de signaler dans l'objet récepteur qu'on souhaite "capter" ce signal et l'"associer" au slot.

Remarques concernant la figure 1 :

  • l'objet B a défini dans sa classe le slot seemsThatSomebodyHasClicked(QString who). Tout comme private, protected, public et signals, il existe aussi une section slots dans les objets Qt servant à définir les méthodes réceptrices des signaux reçus.

  • Le format de la méthode slot doit correspondre au format du signal associé. Ici, on retrouve le paramètre QString.

Pour que le signal somebodyClicked(QString who) déclaré dans l'objet A soit "capté" par l'objet B, il faut le signifier dans le constructeur ou une autre méthode l'objet B de la manière suivante :

1
connect(ObjetA, SIGNAL(somebodyClicked(QString who)), this, SLOT(seemsThatSomebodyHasClicked(QString who)));

La méthode connect() des objets Qt permet de connecter un signal à un slot.

4 paramètres sont nécessaires :

  1. L'adresse de l'objet émetteur du signal.

  2. Le nom du signal à capter encapsulé par la macro instruction Qt SIGNAL.

  3. L'adresse de l'objet récepteur (ici this pour indiquer l'objet en cours, c'est à dire l'objet B).

  4. Le nom du slot à déclencher encapsulé par la macro instruction Qt SLOT.

Cette ligne prépare l'objet B à recevoir le signal somebodyClicked(QString who).

Lorsque l'objet A émettra ce signal, il sera pris en charge par le slot seemsThatSomebodyHasClicked(QString who).