Académique Documents
Professionnel Documents
Culture Documents
Prsentation Licences Dveloppement Structure gnrale de Qt Premier programme Principes Signaux et slots Gestion mmoire
(2010)
Pr sentation
Qt est une bibliothque logicielle oriente objet et dveloppe en C++ par Qt Development Frameworks, filiale de Nokia. Qt est une plateforme de dveloppement dinterfaces graphiques (GUI Graphical User Interface) fournie l'origine par la socit norvgienne Troll Tech, puis rachete par Nokia en fvrier 2008 ( http://qt.nokia.com/ ). Qt permet la portabilit des applications qui n'utilisent que ses composants par simple recompilation du code source. Les environnements supports sont les Unix (dont Linux) qui utilisent le systme graphique X Window System, Windows et Mac OS X.les.
(2010)
Pr sentation
Qt est principalement ddie au dveloppement d'interfaces graphiques en fournissant des lments prdfinis appels widgets (pour windows gadgets) qui peuvent tre utiliss pour crer ses propres fentres et des botes de dialogue compltement prdfinies (ouverture / enregistrement de fichiers, progression d'opration, etc). Qt fournit galement un ensemble de classes dcrivant des lments non graphiques : accs aux donnes, connexions rseaux (socket), gestion des fils d'excution (thread), analyse XML, etc. Qt dispose d'un moteur de rendu graphique 2D performant.
(2010)
Pr sentation
Depuis, Qt4 spare la bibliothque en modules : QtCore : pour les fonctionnalits non graphiques utilises par les autres modules ; QtGui : pour les composants graphiques ; QtNetwork : pour la programmation rseau ; QtOpenGL : pour l'utilisation d'OpenGL ; QtSql : pour l'utilisation de base de donnes SQL ; QtXml : pour la manipulation et la gnration de fichiers XML ; QtDesigner : pour tendre les fonctionnalits de Qt Designer, l'assistant de cration d'interfaces graphiques ; QtAssistant : pour l'utilisation de l'aide de Qt ; Qt3Support : pour assurer la compatibilit avec Qt 3. et de nombreux autres modules, etc. Qt utilise Unicode 4.0 pour la reprsentation de ses chanes de caractres.
(2010)
Pr sentation
Les interactions avec lutilisateur sont gres par un mcanisme appel signal/slot. Ce mcanisme est la base de la programmation vnementielle des applications bases sur Qt. Qt est notamment connu pour tre la bibliothque sur laquelle repose l'environnement graphique KDE, l'un des environnements de bureau les plus utiliss dans le monde Linux. De plus en plus de dveloppeurs utilisent Qt, y compris parmi de grandes entreprises. On peut notamment citer : Google, Adobe Systems, Asus, Samsung, Philips, ou encore la NASA et bien videmment Nokia.
E.Remy B.Ernet J.Souli T.Vaira
(2010)
Pr sentation
Qt Jambi : les possibilits de Qt pour le langage JAVA Qtopia : une version de Qt destine aux dispositifs portables (tlphones, PocketPC, etc..) et aux systmes embarqus ( ex Qt/Embedded) QSA : Qt Script for Applications, ajout de scripts ses applications. Teambuilder : architecture de compilation distribue pour les gros projets d'entreprise.
(2010)
Licences
La socit Trolltech mit tout d'abord la version Unix/Linux de Qt sous licence GNU GPL lorsque l'application dveloppe tait galement sous GNU GPL. Pour le reste, c'est la licence commerciale qui entre en application. Cette politique de double licence est applique pour tous les systmes depuis la version 4.0 de Qt. Le 14 janvier 2009, Trolltech annonce qu' partir de Qt 4.5, Qt sera galement disponible sous licence LGPL v2.1 (Licence publique gnrale limite GNU). Cette licence permet ainsi des dveloppements de logiciels propritaires, sans ncessiter l'achat d'une licence commerciale auprs de Qt Development Frameworks.
(2010)
"
L'API Qt est constitue de classes aux noms prfixs par Q et dont chaque mot commence par une majuscule (QLineEdit, QLabel, ...). Arborescence des objets : Les objets Qt (ceux hritant de QObject) peuvent s'organiser d'eux-mmes sous forme d'arbre. Ainsi, lorsqu'une classe est instancie, on peut lui dfinir un objet parent. La classe QObject :
elle est la classe mre de toutes les classes Qt tout objet dont la classe hrite (directement ou non) de la classe QObject peut mettre et recevoir un signal elle permet une gestion simplifi de la mmoire
(2010)
10
elle hrite de QObject elle est la classe mre de toutes les classes servant raliser des interfaces graphiques
Les widgets :
sont capable de se "peindre" sont capable de recevoir les vnements souris, clavier sont les lments de base des interfaces graphiques sont tous rectangulaires ils sont ordonns suivant laxe z (gestion de la profondeur) ils peuvent avoir un widget parent
(2010)
11
Premier programme
Qt4 pose comme principe que pour utiliser une classe, il faut inclure un fichier header du nom de la classe.
#include <QApplication> #include <QLabel> int main( int argc, char* argv[] ) { QApplication MonAppli( argc, argv ); QLabel *pMonTexte = new QLabel("<H1><center>Bonjour tous</center></H1>", NULL); pMonTexte->resize(200, 70); pMonTexte->show(); return MonAppli.exec(); } La classe QApplication gre les options standards dun programme Qt (argc, argv) et les proprits globales de lapplication : le style des fentres, la couleur du fond, la taille de la fentre principale la boucle dcoute des vnements la rcupration dinformation globale (taille cran) le langage de lapplication internationalisation i18n (cf. L10n, g11n) Un objet de type QApplication doit tre cr avant celle des widgets Utiliser QCoreApplication si lapplication nest pas graphique
Affichage du message Boucle infinie d'attente des vnements jusqu' la fermeture du dernier widget
(2010)
12
Principes de fonctionnement
Elle doit tre cre avant tout objet graphique et reoit tous les paramtres transmis la fonction main (argc, argv). Elle s'occupe de toute la gestion des vnements (et les envoie aux widgets concerns). Cet objet est toujours accessible dans le programme grce au pointeur global nomm qApp. Les applications doivent se terminer proprement en appelant QApplication::quit() Cette mthode est appele automatiquement lors de la fermeture du dernier widget. Un widget est toujours cr cach, il est donc ncessaire d'appeler la mthode show() pour l'afficher
(2010)
13
qmake project
gnre un fichier .pro qui dcrit comment gnrer un Makefile pour compiler ce qui est prsent dans le dossier courant.
qmake [-makefile]
gnre un Makefile partir des informations du fichier .pro
make
appel classique loutil make, par dfaut il utilise un fichier appel Makefile
(2010)
14
Qmake
Qt se voulant un environnement de dveloppement portable et ayant le MOC comme tape intermdiaire avant la phase de compilation/dition de liens, il a t ncessaire de concevoir un moteur de production spcifique. C'est ainsi qu'est conu le programme qmake. Ce dernier prend en entre un fichier (avec l'extension .pro) dcrivant le projet (liste des fichiers sources, dpendances, paramtres passs au compilateur, etc...) et gnre un fichier de projet spcifique la plateforme. Ainsi, sous les systmes UNIX/Linux, qmake produit un Makefile. Le fichier de projet est fait pour tre trs facilement ditable par un dveloppeur. Il consiste en une srie d'affectations de variables. Manuel : http://doc.trolltech.com/4.x/qmake-manual.html
(2010)
15
(2010)
16
Hirarchie
D'une manire gnrale, les widgets sont hirarchiquement inclus les uns dans les autres. Le principal avantage est que si le parent est dplac, les enfants le sont aussi. On va donc ajouter un bouton notre application pour obtenir ceci (les deux lments seront inclus dans un mme widget) :
(2010)
Lors de la cration dun widget on indique le widget parent (ici pMaFenetre). Les widgets sont alors dessins lintrieur de lespace attribu leur parent. Bien sur ce bouton n'a aucune action car une pression dessus ne cre pas d'vnements, il faut utiliser le mcanisme des signaux et slots.
(2010)
1!
D'une manire gnrale, les widgets sont hirarchiquement inclus les uns dans les autres. Le principal avantage est que si le parent est dplac, les enfants le sont aussi. Les gestionnaires de disposition, les classes de Layout, simplifient ce travail :
On peut associer un layout un widget qui devient alors le propritaire du layout et parent des widgets inclus dans le layout void QWidget::setLayout (QLayout *layout)
QHBoxLayout QBoxLayout QVBoxLayout QFormLayout QObject QLayout QGridLayout QStackLayout
(2010)
1"
Signaux et slots
vnements
Pour la gestion des vnements, Qt utilise un mcanisme de communication d'objets faiblement coupls appel signal / slot. Faiblement coupl signifie que l'metteur d'un signal ne sait pas quel objet va le prendre en compte (d'ailleurs, il sera peut tre ignor). De la mme faon, un objet interceptant un signal ne sait pas quel objet a mis le signal. Tout objet dont la classe hrite (directement ou non) de la classe QObject peut mettre et recevoir un signal.
(2010)
20
Signaux et slots
Signaux
Ces signaux n'ont rien voir avec les signaux UNIX ou Linux (de communication inter-processus), ce sont des vnements qui surviennent suite des actions de l'utilisateur. Un signal peut tre connect un autre signal. Dans ce cas, lorsque le premier signal est mis, il entrane l'mission du second. mission d'un signal peut tre "automatique" par exemple lorsqu'on appui sur un bouton, le signal existe dans la classe utilise.
(2010)
21
Signaux et slots
Signaux
La dclaration d'un signal personnalis est possible, il faut savoir qu'il n'a pas de valeur de retour (void) et pas de corps, le mot cl signals apparait dans le fichier d'entte comme public, private...
signals : void nomSignal(parametreSignal);
(2010)
22
Signaux et slots
Slots
Les slots tant des mthodes, ils peuvent tre appels explicitement (sans prsence d'un vnement) comme toute mthode. Ils peuvent donc tre private, protected ou public avec les consquences habituelles pour leur connexion (private pour la classe ...). De mme, ils peuvent tre virtuels et/ou surchargs. Ils ont seulement la proprit d'tre connects un signal et dans ce cas, il sera automatiquement appel lorsque le signal sera mis.
(2010)
23
Signaux et slots
Connexion
signal et slot doivent tre compatibles (avoir la mme signature) pour tre connects. un signal peut tre connect plusieurs slots. Attention : les slots sont activs dans un ordre arbitraire. plusieurs signaux peuvent tre connects un seul slot. une connexion signal / slot peut tre ralise, par la mthode :
bool QObject::connect ( const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) const
(2010)
24
Signaux et slots
Dconnexion
bool QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method )
Vue gnrale
(2010)
25
Signaux et slots
Exemple
#include <qapplication.h> #include <qlabel.h> #include <qpushbutton.h> int main( int argc, char* argv[] ) { QApplication MonAppli( argc, argv ); QWidget *pMaFenetre = new QWidget(); //position hor,vert fenetre, dimensions fenetre pMaFenetre->setGeometry(100,300,200,80); // pour forcer l'affichage avec les accents-> QString::fromUtf8 QLabel* pMonTexte = new QLabel(QString::fromUtf8("<H1><center>Bonjour tous </center></H1>"),pMaFenetre); QPushButton *pMonBouton = new QPushButton("Quitter",pMaFenetre); pMonBouton->setGeometry(40,40,pMonTexte->width(),40);
QObject::connect(pMonBouton,SIGNAL(clicked()),&MonAppli, SLOT(quit()));
pMaFenetre->show(); return MonAppli.exec(); }
26
Gestion m moire
Qt est bas autour du modle d'objet de Qt. Cette architecture est ce qui rend Qt puissant et facile employer. Elle est entirement base autour de la classe QObject et de l'outil moc. Les classes graphiques drivent toutes de QObject. Les QObject s'organisent eux mmes en arbre d'objets. Quand on cre un QObject (un objet graphique par exemple) avec un autre QObject comme parent, l'objet parent ajoute le nouvel objet cr sa liste d'enfants. Si le parent est dtruit (appel de son destructeur), il dtruira automatiquement tous ses enfants. On ne dtruira (oprateur delete) donc que les QObject crs par l'oprateur new qui n'ont pas de parent.
(2010)
Gestion m moire
Exemple :
Chose.h
#include "Chose.h"
Chose.cpp
class Chose : public QObject { public: Chose(QObject *parent = 0, char *nom = 0); ~Chose(); void Existe(); };
Chose::Chose(QObject *parent, char *nom): QObject(parent) { setObjectName(nom); cout << "Constructeur : " << objectName().toStdString() << endl; } Chose::~Chose() { cout << "Destructeur : " << objectName().toStdString() << endl; } void Chose::Existe() { cout << "En excution : " << objectName().toStdString() << endl; }
(2010)
2!
Gestion m moire
Exemple (suite) :
main.cpp
c f a
A b d e
#include "Chose.h" int main( int Chose A(NULL, Chose *aA = Chose *bA = Chose *aaA = Chose *baA = Chose *abA = Chose *aaaA =
argc, char* argv[] ) { "A" ); new Chose(&A, "a"); new Chose(&A, "b"); new Chose(aA, "c"); new Chose(aA, "d"); new Chose(bA, "e"); new Chose(aaA, "f");
Constructeur : A Constructeur : a Constructeur : b Constructeur : c Constructeur : d Constructeur : e Constructeur : f En excution : A En excution : a En excution : b En excution : c En excution : d En excution : e En excution : f Destructeur : A Destructeur : a Destructeur : c Destructeur : f Destructeur : d Destructeur : b Destructeur : e
(2010)
2"
Exemple
#include <QtGui> class Convertisseur : public QWidget { Q_OBJECT private: QLineEdit *valeur; QLabel *resultat; QComboBox *choix; QPushButton *bConvertir; QPushButton *bQuitter; public: Convertisseur(QWidget *parent = NULL); ~Convertisseur(); signals: void actualiser(); private slots: void convertir(); void permuter(int index); };
(2010)
30
Exemple
#include <QApplication> #include "Convertisseur.h" int main(int argc, char* argv[]) { QApplication app(argc, argv); Convertisseur convertisseur; convertisseur.adjustSize(); convertisseur.show(); return app.exec(); }
(2010)
31
Exercice
#include "Convertisseur.h" Convertisseur::Convertisseur(QWidget *parent) : QWidget(parent) { valeur = new QLineEdit(this); resultat = new QLabel(this); choix = new QComboBox(this); bConvertir = new QPushButton("Convertir", this); bQuitter = new QPushButton("Quitter", this); valeur->setGeometry(10, 10, 50, 30); resultat->setGeometry(290, 10, 50, 30); choix->setGeometry(70, 10, 200, 30); bConvertir->setGeometry(10, 50, 120, 30); bQuitter->setGeometry(200, 50, 120, 30); choix->addItem("Celcius -> Farenheit"); choix->addItem("Farenheit -> Celcius"); connect(bConvertir, SIGNAL(clicked()), this, SLOT(convertir())); connect(this, connect(choix, connect(bQuitter, }
(2010)
32
Exercice
Convertisseur::~Convertisseur() {} void Convertisseur::convertir() { switch (choix->currentIndex()) { case 0: resultat->setText(QString::fromUtf8("%1F").arg(9 * valeur->text().toDouble() / 5 + 32, 0, 'f', 2)); break; case 1: resultat->setText(QString::fromUtf8("%1C").arg(5 * (valeur->text().toDouble() 32 ) / 9, 0, 'f', 2)); break; } } void Convertisseur::permuter(int index) { valeur->setText(resultat->text().left(resultat->text().size() - 2));
(2010)
33
Documentation (http://doc.qt.nokia.com/)
Tutoriel : http://doc.trolltech.com/4.7/tutorials.html La rfrence Qt4 : http://doc.trolltech.com/4.7/index.html, et plus particuli rement les concepts de base (http://doc.trolltech.com/4.7/qt-basic-concepts.html) : Signals and Slots ; Main Classes ; Main Window Architecture ; Internationalization (pensez crire votre programme en anglais puis le traduire en franais) ; OpenGL Module. Les documentations des outils indispensables : qmake (http://doc.trolltech.com/4.7/qmake-tutorial.html) ; Qt Designer (http://doc.trolltech.com/4.7/designer-manual.html) ; Qt Linguist (http://doc.trolltech.com/4.7/linguist-manual.html) ; Qt Creator (http://doc.qt.nokia.com/qtcreator-2.0/index.html).
(2010)
34
Documentation
Qt Centre : http://www.qtcentre.org/ Qt Forum (en anglais) : http://www.qtforum.org/ QtFr, un site franais, http://www.qtfr.org/ L'Independant Qt Tutorial qui est plein d'exemples (et disponible en fran ais) : http://www.digitalfanatics.org/projects/qt_tutorial/ Qt-Apps.org propose un annuaire de programmes libres construits sur Qt : http://www.qt-apps.org/ Et Qt-Prop.org, l'quivalent pour les programmes non-libres (comme Skype et GoogleEarth) : http://www.qt-prop.org/
35