Cours:SignalSlotQT

De troyesGEII
Révision datée du 19 novembre 2018 à 16:33 par Bjacquot (discussion | contributions) (ajouter un attribut dans la classe MainWindow)
Aller à : navigation, rechercher
Retour à la liste des Tds

Au besoin, la documentation QT peut-être intéressante : http://doc.qt.io/qt-5/signalsandslots.html

spécialisation de la classe QObject

Principe :

  • créer nouvelle classe
  • nom de la classe : MaClasse (respecter la casse : ! les capitales au bon endroit ! )
  • Base class : QObject
  • terminé !
// fichier dans lequel est déclaré la classe QObject
#include <QObject>

// on hérite de la classe QObject
class MaClasse : public QObject
{
// mot clé pour que qmake fasse son job pour les signaux/slots notamment
    Q_OBJECT
public:
// constructeur de la classe :
// le "explicit" empêche de faire des conversions bizarroïdes entre classes
// ce n'est pas à retenir
    explicit MaClasse(QObject *parent = nullptr);

signals:

public slots:
};

une classe utile :

On va faire une classe lampe :

  • elle aura un attribut privé : isAllume de type bool
  • des slots (en gros le nom des méthodes sur QT) dont les prototypes sont :
    • void allumer()
    • void eteindre()
    • void changerEtat()
  • un signal
    • il suffit de rajouter le signal dans la déclaration de la classe (header file), rien dans le cpp !
    • on ajoute dans la partie signals:
    • void valueChanged(int newValue);
    • lorsque c'est nécessaire on envoie la nouvelle valeur de la façon suivante :
    • emit valueChanged(valeur);
    • il faut bien entendu remplacer valeur par un truc intéressant !

Remarque : vous pouvez laisser de côté changerEtat pour le moment.

Utilisation de la classe

ajouter un attribut dans la classe MainWindow

Pour ajouter un objet de notre nouvelle classe, on doit bien entendu ajouter sa définition à l'endroit où on souhaite l'utiliser :

#include "maclasse.h"

On va ensuite ajouter dans la classe MainWindow un attribut (ou plusieurs), de préférence privé :

....
class MainWindow : public ....
{
....
private :
  MaClasse obj1;
  MaClasse obj2;
...
}

relier signal avec slot

principe

connect(&objetEmetteur,SIGNAL(signalEmis()),&objetRecepteur,SLOT(slotToExecute()));

afficher un message

changer couleur d'un bouton

Plusieurs "connect" sur le même signal.

Plusieurs lampes

clignotement avec QTimer