Bienvenue, vous n'êtes pas connecté. ( Se connecter - S'enregistrer )

LA RÈGLEMENTATION DE L'UNION EUROPÉENNE
Webosoft Twitter
Animes , naruto , bleach
Annuaire de sites web
3D tuto , retrouvez des tutoriels pour vos logiciels de 3D préférés



Partager

Webosoft - Forum > Tutoriels > Languages > C/C++ > Bibliotèques > Qt > Tuto 4 : signaux / slots

RSS >  Tuto 4 : signaux / slots
a30barrett40 #1 27/06/2009 - 15h18

Codeur entrainé
Groupe : Codeur entrainé
Messages : 321
Enregistré le : 05/03/2007

Hors ligne

Bon, jusqu'à maintenant les fenêtres étaient peu ... interactives. Reprenons le code du tuto 3, et on va faire en sorte que lorsqu'on appuie sur le bouton, la fenêtre se ferme.

Bon, de la théorie maintenant (je sais, c'est chiant) : Qt a introduit un nouveau mécanisme pour la gestion des évènements, le système signal/slot. Concrètement, ce qui ce passe, c'est que lorsqu'un signal est émit, le slot auquel il a été connecté est appelé. Quoi c'est compliqué ? Allez programmer avec les API de base de Windows ou de Linux (respectivement Win32 et X11), et vous verrez qu'il faut une centaine de ligne de code pour arriver à un résultat correct. Donc, il y a 4 nouveautés dans la définition simple que je vous ai donné. Tout d'abord, le signal : il correspond à la fonction envoyé lorsque l'évènement correspondant est réalisé. L'émission du signal permet de dire "Ce signal s'est réalisé". Le slot correspond à la fonction de traitement des données correspondant au signal. La connection, elle, est une fonction qui permet de signaler à Qt que lorsque tel signal est émit, il doit appeler tel slot.

Plutôt simple, non ? Mais comme il y a quelques modifications à faire (on ne fait pas tout, on délègue aussi à Qt), il faut absolument passer par les outils de Qt via qmake : en effet le code écrit ne changera pas beaucoup !

Passons au choses sérieuses, pour pouvoir bénéficier du système signal/slot, il faut 2 éléments :
   - hériter de QObject ou d'une de ses classes filles voire plus loin : pas de problème, notre classe Fenetre en hérite via QWidget.
   - rajouter la macro Q_OBJECT (attention, pas de fautes possibles) au début de la définition de la classe correspondante.

La, je vous montre :
#ifndef DEF_FENETRE_H
#define DEF_FENETRE_H

#include <QPushButton>

class Fenetre : public QWidget
{
      Q_OBJECT

      public :
              Fenetre();
             
      private :
              QPushButton* m_bouton;
};

#endif


Voilà, notre classe est prête à utiliser les signaux et les slots. Bon, il y a 3 nouveaux mots clés à connaitre :
- slots : lors de la définition de la classe, pour toutes les fonctions qui pourront être appelés comme slots, qui doit être précédé de public, protected ou private car on peut appeler ces fonction directement.
- signals : rien à mettre devant, juste pour signaler que les définitions des signaux se font dans cette section.
- emit : dire que l'on émet tel signal.

Bon, on va créer un slot pour quand le bouton sera appuyé, un signal correspondant.
A oui, j'ai oublié la fameuse connexion. On va pas aller loin. Il s'agit d'une fonction statique et publique de QObject. Elle fonctionne de la façon suivante :
connect(objemet, SIGNAL(signalemit(...)), objrec, SLOT(slotapl(...))); Où objmet correspond à l'objet qui émet le signal signalemit, et objrec l'objet correspondant qui contient le signal slotapl.

L'avantage de ce système est que l'on peut envoyer des données. Il faut que le signal et le slot aient les mêmes paramètres, aussi il faut que ces fonctions retournent rien. Les signaux, on ne les implémente pas, c'est Qt qui s'en charge. Et on fait les connections dans le constructeur de la fenêtre en général.

Bon, petit exo : on va donc reprendre ce que je voulait faire

Bon, on va créer un slot pour quand le bouton sera appuyé, un signal correspondant.

et vous allez vous débrouiller.
Infos :
   - le signal correspondant à un appui dans QPushButton est void trigerred().
   - pour quitter le programme, c'est le slot quit() de la classe QApplication, qui propose un pointeur global qApp sur l'instance de votre application.

Au boulot, plus vite  :charte: ...

Quoi, la solution ? Plus tard !
Spoilerfenetre.h :
#ifndef DEF_FENETRE_H
#define DEF_FENETRE_H

#include <QPushButton>

class Fenetre : public QWidget
{
      Q_OBJECT

      public :
              Fenetre();

      public slots :
              void boutonAppuyer();

      signal :
              void quitter();
             
      private :
              QPushButton* m_bouton;
};

#endif


fenetre.cpp :
#include "fenetre.h"
#include <QApplication>

Fenetre::Fenetre()
{
      m_bouton = new QPushButton("Salut !", this);
     
      setFixedSize(300, 200);
     
      m_bouton->move(60, 40);
      m_bouton->setFont(QFont("Comic sans MS", 20));
      m_bouton->setCursor(Qt::PointingHandCursor);

      connect(m_bouton, SIGNAL(trigerred()), this, SLOT(boutonAppuyer()));
      connect(this, SIGNAL(quitter()), qApp, SLOT(quit()));
}

void Fenetre::boutonAppuyer()
{
     emit quitter();
}



Voilà. Prochaine étape : la doc de Qt. Pourquoi vous vous enfuyez ? Bizarre, j'ai eu la même réaction à cette annonce, et pourtant on apprend beaucoup quand on sait l'utiliser !
"Il n’y a pas de langage informatique dans lequel vous ne puissiez écrire de mauvais programme. " (Loi des Langages informatiques, Extrait de Les Lois de Murphy)

"Derrière une erreur informatique s'en cache 2 humaines, dont celle d'attribuer l'erreur à l'ordinateur en question."

"Il n'y a pas de bug, juste des fonctionnalités non documentées."

 >  Réponse rapide

Composez votre message

Webosoft - Forum > Tutoriels > Languages > C/C++ > Bibliotèques > Qt > Tuto 4 : signaux / slots

 >  Informations du forum

1 personne(s) présente(s) durant une période de 10 minutes (0 membre(s) et 1 invité(s)).