Gestion des signaux/slots dans une application Qt
Fondamental : Objet 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éfinition : Signal 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.
Remarques concernant la figure 1 :
l'objet A a défini dans sa classe un signal
somebodyClicked(QString who)
. Tout commeprivate
,protected
etpublic
, il existe aussi une sectionsignals
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).
Attention : signal (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éfinition : Slot 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 commeprivate
,protected
,public
etsignals
, il existe aussi une sectionslots
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 :
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 :
L'adresse de l'objet émetteur du signal.
Le nom du signal à capter encapsulé par la macro instruction Qt
SIGNAL
.L'adresse de l'objet récepteur (ici
this
pour indiquer l'objet en cours, c'est à dire l'objet B).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)
.