[Sommaire]
[Next: Chapitre 2]
Carnet d'adresses 1 - Conception de l'interface utilisateur
Файлы:
La premi?re partie de ce tutoriel traite de la conception d'une interface graphique (GUI) basique, que l'on utilisera pour l'application Carnet d'adresses.
La premi?re ?tape dans la cr?ation d'applications graphiques est la conception de l'interface utilisateur. Dans ce chapitre, nous verrons comment cr?er les labels et champs de saisie n?cessaires ? l'implementation d'un carnet d'adresses de base. Le r?sultat attendu est illustr? par la capture d'?cran ci-dessous.
Nous allons avoir besoin de deux objets QLabel, nameLabel et addressLabel, ainsi que deux champs de saisie: un objet QLineEdit, nameLine, et un objet QTextEdit, addressText, afin de permettre ? l'utilisateur d'entrer le nom d'un contact et son adresse. Les widgets utilis?s ainsi que leur placement sont visibles ci-dessous.
Trois fichiers sont n?cessaires ? l'impl?mentation de ce carnet d'adresses:
- addressbook.h - le fichier de d?finition (header) pour la classe AddressBook,
- addressbook.cpp - le fichier source, qui comprend l'impl?mentation de la classe AddressBook
- main.cpp - le fichier qui contient la m?thode main() , et une instance de la classe AddressBook.
Programmation en Qt - h?ritage
Lorsque l'on ?crit des programmes avec Qt, on a g?n?ralement recours ? l'h?ritage depuis des objets Qt, afin d'y ajouter des fonctionnalit?s. C'est l'un des concepts fondamentaux de la cr?ation de widgets personnalis?s ou de collections de widgets. Utiliser l'h?ritage afin de compl?ter ou modifier le comportement d'un widget pr?sente les avantages suivants:
- La possibilit? d'impl?menter des m?thodes virtuelles et des m?thodes virtuelles pures pour obtenir exactement ce que l'on souhaite, avec la possibilit? d'utiliser l'impl?mentation de la classe m?re si besoin est.
- Cela permet l'encapsulation partielle de l'interface utilisateur dans une classe, afin que les autres parties de l'application n'aient pas ? se soucier de chacun des widgets qui forment l'interface utilisateur.
- La classe fille peut ?tre utilis?e pour cr?er de nombreux widgets personnalis?s dans une m?me application ou biblioth?que, et le code de la classe fille peut ?tre r?utilis? dans d'autres projets
Comme Qt ne fournit pas de widget standard pour un carnet d'adresses, nous partirons d'une classe de widget Qt standard et y ajouterons des fonctionnalit?s. La classe AddressBook cr?e dans ce tutoriel peut ?tre r?utilis?e si on a besoin d'un widget carnet d'adresses basique.
La classe AddressBook
Le fichier addressbook.h permet de d?finir la classe AddressBook.
On commence par d?finir AddressBook comme une classe fille de QWidget et d?clarer un constructeur. On utilise ?galement la macro Q_OBJECT pour indiquer que la classe exploite les fonctionnalit?s de signaux et slots offertes par Qt ainsi que l'internationalisation, bien que nous ne les utilisions pas ? ce stade.
class AddressBook : public QWidget
{
Q_OBJECT
public:
AddressBook(QWidget *parent = 0);
private:
QLineEdit *nameLine;
QTextEdit *addressText;
};
La classe contient les d?clarations de nameLine et addressText, les instances priv?es de QLineEdit et QTextEdit mentionn?es pr?c?demment. Vous verrez, dans les chapitres ? venir que les informations contenues dans nameLine et addressText sont n?cessaires ? de nombreuses m?thodes du carnet d'adresses.
Il n'est pas n?cessaire de d?clarer les objets QLabel que nous allons utiliser puisque nous n'aurons pas besoin d'y faire r?f?rence apr?s leur cr?ation. La fa?on dont Qt g?re la parent? des objets est trait?e dans la section suivante.
La macro Q_OBJECT impl?mente des fonctionnalit?s parmi les plus avanc?es de Qt. Pour le moment, il est bon de voir la macro Q_OBJECT comme un raccourci nous permettant d'utiliser les m?thodes tr() et connect().
Nous en avons maintenant termin? avec le fichier addressbook.h et allons passer ? l'impl?mentation du fichier addressbook.cpp.
Impl?mentation de la classe AddressBook
Le constructeur de la classe AddressBook prend en param?tre un QWidget, parent. Par convention, on passe ce param?tre au constructeur de la classe m?re. Ce concept de parent?, o? un parent peut avoir un ou plusieurs enfants, est utile pour regrouper les Widgets avec Qt. Par exemple, si vous d?truisez le parent, tous ses enfants seront d?truits ?galament.
AddressBook::AddressBook(QWidget *parent)
: QWidget(parent)
{
QLabel *nameLabel = new QLabel(tr("Name:"));
nameLine = new QLineEdit;
QLabel *addressLabel = new QLabel(tr("Address:"));
addressText = new QTextEdit;
? l'int?rieur de ce constructeur, on d?clare et instancie deux objets locaux QLabel, nameLabel et addressLabel, de m?me on instancie nameLine et addressText. La m?thode tr() renvoie une version traduite de la cha?ne de caract?res, si elle existe; dans le cas contraire, elle renvoie la cha?ne elle m?me. On peut voir cette m?thode comme un marqueur <ins?rer la traduction ici>, permettant de rep?rer les objets QString ? consid?rer pour traduire une application. Vous remarquerez, dans les chapitres ? venir comme dans les exemples Qt, qu'elle est utilis?e chaque fois que l'on utilise une cha?ne susceptible d'?tre traduite.
Lorsque l'on programme avec Qt, il est utile de savoir comment fonctionnent les agencements ou layouts. Qt fournit trois classes principales de layouts pour contr?ler le placement des widgets: QHBoxLayout, QVBoxLayout et QGridLayout.
On utilise un QGridLayout pour positionner nos labels et champs de saisie de mani?re structur?e. QGridLayout divise l'espace disponible en une grille, et place les widgets dans les cellules que l'on sp?cifie par les num?ros de ligne et de colonne. Le diagramme ci-dessus pr?sente les cellules et la position des widgets, et cette organisation est obtenue ? l'aide du code suivant:
QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(nameLabel, 0, 0);
mainLayout->addWidget(nameLine, 0, 1);
mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop);
mainLayout->addWidget(addressText, 1, 1);
On remarque que le label AddressLabel est positionn? en utilisant Qt::AlignTop comme argument optionnel. Ceci est destin? ? assurer qu'il ne sera pas centr? verticalement dans la cellule (1,0). Pour un aper?u rapide des layouts de Qt, consultez la section Layout Classes.
Afin d'installer l'objet layout dans un widget, il faut appeler la m?thode setLayout() du widget en question:
setLayout(mainLayout);
setWindowTitle(tr("Simple Address Book"));
}
Enfin, on initialise le titre du widget ? "Simple Address Book"
Ex?cution de l'application
Un fichier s?par?, main.cpp, est utilis? pour la m?thode main(). Dans cette fonction, on cr?e une instance de QApplication, app. QApplication se charge de des ressources communes ? l'ensemble de l'application, tel que les polices de caract?res et le curseur par d?faut, ainsi que de l'ex?cution de la boucle d'?v?nements. De ce fait, il y a toujours un objet QApplication dans toute application graphique en Qt.
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
AddressBook *addressBook = new AddressBook;
addressBook->show();
return app.exec();
}
On construit un nouveau widget AddressBook sur le tas en utilisant le mot-cl? new et en invoquant sa m?thode show() pour l'afficher. Cependant, le widget ne sera pas visible tant que la boucle d'?v?nements n'aura pas ?t? lanc?e. On d?marre la boucle d'?v?nements en appelant la m?thode exec() de l'application; le r?sultat renvoy? par cette m?thode est lui m?me utilis? comme valeur de retour pour la m?thode main().
[Sommaire]
[Next: Chapitre 2]
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|