Cours:HeritageWidgetQT
Retour à la liste des Tds
Sommaire
Principe
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.
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.
Faisons donc un clic droit sur ce QPushButton et sélectionnons Promouvoir en ....
Celui avec les ... !!!
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 :
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
- par ici pour la couleur !
- c'est ma couleur que je change
- this->set....
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é !
Au besoin vous pouvez utiliser ces fichiers : Media:LampeQT.zip
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