VI. Soyons widgets▲
- tutorials/tutorial/t4/main.cpp
- tutorials/tutorial/t4/t4.pro
Cet exemple montre comment on peut créer un widget personnalisé et en contrôler les tailles minimale et maximale
#include
<QApplication>
#include
<QFont>
#include
<QPushButton>
#include
<QWidget>
class
MyWidget : public
QWidget
{
public
:
MyWidget(QWidget
*
parent =
0
);
}
;
MyWidget::
MyWidget(QWidget
*
parent)
:
QWidget
(parent)
{
setFixedSize(200
, 120
);
QPushButton
*
quit =
new
QPushButton
(tr("Quit"
), this
);
quit->
setGeometry(62
, 40
, 75
, 30
);
quit->
setFont(QFont
("Times"
, 18
, QFont
::
Bold));
connect
(quit, SIGNAL
(clicked()), qApp
, SLOT
(quit()));
}
int
main(int
argc, char
*
argv[])
{
QApplication
app(argc, argv);
MyWidget widget;
widget.show();
return
app.exec();
}
VI-A. Analyse du code ligne par ligne▲
class
MyWidget : public
QWidget
{
public
:
MyWidget(QWidget
*
parent =
0
);
}
;
Ici nous créons une nouvelle classe. Comme cette classe hérite de QWidget, cette nouvelle classe est un widget et peut être, soit une "fenêtre de premier plan", soit un widget enfant (comme le QPushButton du chapitre précédent).
Cette classe possède un seul membre, un constructeur (en plus des membres qu'elle hérite de QWidget). Le constructeur est un constructeur d'un widget standard de Qt ; vous devez toujours inclure un constructeur similaire quand vous créez des widgets.
L'argument est son widget parent. Pour créer une fenêtre de premier plan, vous devez spécifier un pointeur NULL comme parent. Comme vous pouvez le voir, ce widget est une fenêtre de premier plan par défaut.
MyWidget::
MyWidget(QWidget
*
parent)
L'implémentation du constructeur commence ici. Comme pour la plupart des widgets, ce constructeur ne fait que transmettre le parent au constructeur de QWidget.
:
QWidget
(parent)
{
setFixedSize(200
, 120
);
Comme ce widget ne sait pas comment gérer le redimensionnement, nous fixons sa taille. Dans le prochain chapitre, nous verrons comment un widget peut répondre à un événement de redimensionnement déclenché par l'utilisateur.
QPushButton
*
quit =
new
QPushButton
(tr("Quit"
), this
);
quit->
setGeometry(62
, 40
, 75
, 30
);
quit->
setFont(QFont
("Times"
, 18
, QFont
::
Bold));
Ici, nous créons et configurons un nouveau widget, enfant de ce widget (le parent de ce nouveau widget est this, c'est-à-dire l'instance de MyWidget).
L'appel à la fonction tr() pour le texte « Quit » désigne ce texte comme "destiné à être traduit", rendant ainsi possible son remplacement ultérieur à l'exécution à partir du contenu d'un fichier de traduction. C'est une bonne habitude, au cas où vous décideriez plus tard de traduire votre application dans d'autres langues, que d'utiliser tr() pour tous les textes visibles par l'utilisateur.
Notez que quit est une variable locale dans le constructeur. MyWidget ne conserve aucune trace d'elle : Qt, lui, le fait, mais la supprimera automatiquement quand l'objet MyWidget sera supprimé. C'est pourquoi MyWidget n'a pas besoin de destructeur (par ailleurs, il n'y a aucun risque à supprimer un enfant quand vous le décidez : l'enfant informe automatiquement Qt de sa mort imminente).
L'appel à QWidget::setGeometry() définit à la fois la position du widget à l'écran et sa taille. Cela revient à appeler QWidget::move() suivi de QWidget::resize().
connect
(quit, SIGNAL
(clicked()), qApp
, SLOT
(quit()));
}
Le pointeur qApp est une variable globale déclarée dans le fichier d'en-tête QApplication. Il pointe vers l'instance unique QApplication de l'application.
int
main(int
argc, char
*
argv[])
{
QApplication
app(argc, argv);
MyWidget widget;
widget.show();
return
app.exec();
}
Ici nous instancions notre nouvel enfant, nous l'affichons et nous lançons l'application.
VI-B. Lancer l'application ▲
Ce programme a un comportement similaire au précédent. La différence réside dans la manière dont nous l'avons implémenté. Aussi, il réagit un peu différemment. Essayez juste de le redimensionner pour voir.
VI-C. Exercices▲
Essayez de créer un autre objet MyWidget dans la fonction main(). Que se passe-t-il ?
Essayez d'ajouter plus de boutons ou mettez d'autres widgets que QPushButton.