Cours:PooQT : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
({{Bleu|A vous !}})
Ligne 107 : Ligne 107 :
 
*avec un slot de prototype : void changeCouleur(int etat)
 
*avec un slot de prototype : void changeCouleur(int etat)
 
*qui change la couleur de fond en fonction du paramètre etat
 
*qui change la couleur de fond en fonction du paramètre etat
*par [[Cours:QT#Modifier_la_couleur_d.27un_bouton|ici pour la couleur !]]
+
**par [[Cours:QT#Modifier_la_couleur_d.27un_bouton|ici pour la couleur !]]
 +
**c'est {{Rouge|ma}} couleur que je change
 +
**this->set....

Version du 12 novembre 2017 à 22:01

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 ...
}

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 Modèle:Rouge ... !!!

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é une nouvelle sorte 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