« Programmation Qt/Signaux et slots » : différence entre les versions

m
Relecture
m (Relecture)
 
Dans le premier exemple du chapitre précédent, cliquer sur le bouton "Hello world!" ne déclenchait aucune action.
Pour qu'un bouton puisse être utile, il faut connecter le signal <ttcode>clicked()</ttcode> à un slot ayant la même signature.
 
== Définition ==
Tout [[../Classes et objets Qt|objet Qt]] peut définir des signaux, et des slots pour recevoir des signaux en provenance d'autres objets Qt.
 
Conclusion : en appuyant par exemple sur un bouton, celui-ci envoie le signal <code>clicked()</code>. Quand on recevra ce signal de la part de ce bouton on va déclencher une action par un slot : par exemple la fenêtre qui quitte.
 
=== Définir un signal ===
Un slot peut recevoir plusieurs signaux, c'est à dire qu'on peut connecter le même slot à plusieurs signaux.
 
La connexion entre un signal et un slot s'effectue en appelant la méthode statique <ttcode>connect</ttcode> de la classe <tt>QObject</tt>.
Cette méthode possède 5 paramètres :
;<code>sender</code>:L'objet source du signal ;
;<code>signal</code>:Le signal émis par l'objet source;
;<code>receiver</code>:L'objet receveur du signal ;
;<code>slot</code>:Le slot du receveur connecté au signal ;
;<code>type</code>:(optionnel) Type de connexion (automatique par défaut).
Seuls les 4 premiers sont obligatoires.
 
Exemple utilisant les classes <ttcode>Téléchargement</ttcode> et <ttcode>Stockage</ttcode> vues auparavant :
 
{{FichierDébut|Main.cpp|info=(extrait) Connextion entre signaux et slots|icon=Crystal128-source-cpp.svg}}
 
Le slot doit posséder une signature compatible avec le signal auquel il est connecté. C'est-à-dire :
* Il doit posséder le même nombre de paramètre ou moins que le signal. Les paramètres manquants seront ignorés (voir l'exemple précédent pour le slot <ttcode>finArchivage()</ttcode> connecté au signal <ttcode>fichierRecu(QString)</ttcode>).
* Ces paramètres doivent être du même type.
* Un signal retourne toujours void.
 
 
===voiciDécouverte de <code>connect!()</code>===
 
<code>connect()</code> est une méthode statique.
pour appeler une méthode statique:
<source lang="cpp-qt">QObject::connect();</source>
 
La méthode <code>connect</code> prend 4 arguments :
 
* Un pointeur vers l'objet qui émet le signal
* Le nom du slot qui doit s'exécuter lorsque le signal se produit.
 
===exerciceExercice ,: quitterla quandfenêtre onse appuieferme après avoir cliquer sur leun bouton===
Lançons-nous dans la création du code de <code>mafenetre.cpp</code>.<source lang="cpp-qt">
 
faisons un code (mafenetre.cpp)
<source lang="cpp-qt">
//main.cpp
#include <QApplication>
</source>
 
Exécutons la commande <code>qmake</code>.
faite qmake , make
 
Testons notre code ! une fenêtre s'ouvre
Rien de bien extraordinaire à première vue. Sauf que... si vous cliquez sur le bouton "Quitter", le programme s'arrête !
 
===Utilisation de la méthode <code>connect()</code> pour afficher "A propos"===
 
On peut faire un autre essai pour se faire un peu plus la main si vous voulez.
 
Je vous ai parlé d'un autre slot de <code>QApplication : aboutQt()</code>.
Je vous propose de créer un second bouton qui se chargera d'afficher la fenêtre "A propos de Qt".
 
voiciVoici le code:
<source lang="cpp-qt">
//MaFenetre.h
Quant à "A propos", il provoque l'ouverture de la fenêtre "A propos de Qt".
 
==paramètreParamétrage dans ledes signaux et lesdes slotslots==
 
La méthode statique <code>connect()</code> est assez originale, vous l'avez vu. Il s'agit justement d'une des particularités de Qt que l'on ne retrouve pas dans les autres bibliothèques.
 
<poem>maintenantMaintenant, comment faire uneun slider, barà l'aide d'un <code>[[Programmation Qt/Les widgets#QSlider : un curseur|QSlider]]</code> qui quand la valeur change fait changer la valeur d'un afficher LCD (<code>[[Programmation Qt/Les widgets#QLCDNumber : un label pour nombre|QLCDNumber]]</code>) ?
 
 
351

modifications