Cours:PooQT

De troyesGEII
Révision datée du 3 juillet 2018 à 12:49 par Bjacquot (discussion | contributions) ({{Bleu|utilisation dans l'interface graphique}})
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

Spécialisation d'un QWidget

Bien souvent, les widgets mis à disposition ne remplissent que partiellement notre cahier des charges.

Plutôt que de réécrire une nouvelle classe entièrement, il suffit la plupart du temps d'ajouter des fonctionnalités (slot, attribut ...) à une classe existance :

On spécialise une classe

L'objectif sera pour vous de concevoir un bouton possédant un slot qui permettra de changer sa couleur de remplissage (background-color) en fonction d'un paramètre de type int.

Vous pouvez repartir du projet suivant si les parties précédentes n'ont pas été toutes traitées : Media:LampeQT.zip

Une nouvelle classe

Nous souhaitons faire une classe qui hérite de QPushButton, ce qui se traduit par :

classe MonButton: public QPushButton
{
  Q_OBJECT
  ...
}

Remarque : Lorsque vous créez votre nouvelle classe dans qtcreator, utilisez QWidget comme "base class"

  • Dans QT, tous les objets graphiques héritent de la classe QWidget
  • Les différents objets sont nécessairement placés dans un conteneur (un groupe d'éléments graphiques).
  • On doit nécessairement indiquer dans le constructeur le widget parent (conteneur)
  • Le constructeur doit donc avoir un paramètre de type QWidget
  ...
public :
  MonButton(QWidget * parent = 0); // valeur par défaut 0 : pas de parent
  ...

La définition du constructeur dans le fichier cpp sera de la forme :

MonButton::MonButton(QWidget * parent)
          :QPushButton(parent)         // exécution du constructeur de la classe mère avant toute autre action
{
   // on peut ajouter ici l'initialisation d'attributs
   // ou autre ...
   // par exemple on rend le bouton non cliquable
   this->setDisabled(true);
}

Bien entendu, on va ajouter des nouvelles fonctionnalités en déclarant les prototypes des méthodes/slots dans le .h et en les définissant dans le .cpp

...
// .h
public slots :
  void maFonction( mes paramètres );
...
// .cpp
void MonButton::maFonction( mes paramètres )
{
  // on fait le job ici !!
}
...

utilisation dans l'interface graphique

QT Designer (le logiciel derrière l'édition graphique de l'interface) ne connaît pas votre nouveau type de Widget, et ne vous le proposera jamais dans la liste des widgets disponibles !

Nous placerons donc toujours un objet de la classe mère : QPushButton ici.

Todo.jpg C'est fait ?

Faisons donc un clic droit sur ce QPushButton et sélectionnons Promouvoir en ....

Celui avec les  ... !!!

Todo.jpg Nous allons ajouter une nouvelle classe promue :

  • la classe de base : QPushButton
  • la classe promue : MonButton
  • fichier d'en tête : normalement monbutton.h

Bon, nous avons en quelque sorte ajouté un nouveau type de QPushButton, il suffit maintenant de promouvoir chacun des boutons que l'on souhaite spécialiser :

Todo.jpg clic droit sur le bouton -> promouvoir en -> MonButton

connecter le tout

Il ne reste plus qu'à utiliser ce nouveau widget, sans doute en connectant un signal à un slot !!

...
connect( ???? ,SIGNAL(????(un/des paramètres)), ui->superBouton, SLOT(maFonction( un/des paramètres )));
...


A vous !

L'objectif donc :

  • créer une classe BpLampe
  • qui hérite de QPushButton
  • avec un slot de prototype : void changeCouleur(int etat)
  • qui change la couleur de fond en fonction du paramètre etat

Same player ...

Nous avons utilisé juste avant l'architecture MVC :

  • un modèle  : classe lampe
  • une vue  : classe BpLampe et les widgets boutons ...
  • un contrôleur : classe ... controller bien joué !

On peut aussi avoir une architecture plus simple avec juste :

  • un controleur : rien de changé ici
  • une vue :
    • objets graphiques standard : bps ...
    • une classe lampeGraphique qui mélange vue et modèle :
      • qui hérite de QPushButton
      • un attribut etat
      • qui possède des méthodes
        • allumer
        • eteindre

Todo.jpg A vos claviers