Vous êtes sur la page 1sur 35

Programmation v nementielle

Prsentation Licences Dveloppement Structure gnrale de Qt Premier programme Principes Signaux et slots Gestion mmoire

E.Remy B.Ernet J.Souli T.Vaira

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

E.Remy B.Ernet J.Souli T.Vaira

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

E.Remy B.Ernet J.Souli T.Vaira

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

E.Remy B.Ernet J.Souli T.Vaira

(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

L'environnement de Qt est aussi constitu de :

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.

E.Remy B.Ernet J.Souli T.Vaira

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

Les licences Qt : http://qt.nokia.com/products/licensing/ Les licences GNU : http://www.gnu.org/licenses/licenses.fr.html


(2010)

E.Remy B.Ernet J.Souli T.Vaira

Environnement de D veloppement Int gr


Qt Creator est l'environnement de dveloppement intgr ddi Qt et facilite la gestion d'un projet Qt. Son diteur de texte offre les principales fonctions que sont la coloration syntaxique, le compltement, l'indentation, etc... Qt Creator intgre en son sein les outils Qt Designer et Qt Assistant. Mme si Qt Creator est prsent comme l'environnement de dveloppement de rfrence pour Qt, il existe des modules Qt pour les environnements de dveloppement Eclipse et Visual Studio. Il existe d'autres EDI ddis Qt et dvelopps indpendamment de Nokia, comme QDevelop et Monkey Studio. Qt Designer est un logiciel qui permet de crer des interfaces graphiques Qt dans un environnement convivial. L'utilisateur, par glisser-dposer, place les composants d'interface graphique et y rgle leurs proprits facilement. Les fichiers d'interface graphique sont formats en XML et portent l'extension .ui. Lors de la compilation, un fichier d'interface graphique est converti en classe C++ par l'utilitaire uic.

E.Remy B.Ernet J.Souli T.Vaira

(2010)

Environnement de D veloppement Int gr


QDevelop est un environnement de dveloppement intgr libre pour Qt. Le but de QDevelop est de fournir dans les environnements les plus utiliss, Linux, Windows et Mac OS X d'un outil permettant de dvelopper en Qt de la mme manire avec un IDE unique. Il intgre galement les outils Qt-Designer pour la cration d'interface graphique et Qt-Linguist pour le support de l'internationalisation. KDevelop est un environnement de dveloppement intgr (IDE) pour KDE. Il intgre galement les outils Qt-Designer pour la cration d'interface graphique et Qt-Linguist pour la gestion de l'internationalisation. Autres bibliothques gnralistes multi-plateformes, parmi les plus connus :

GTK+, utilise par l'environnement graphique GNOME wxWidgets (anciennement wxWindows)


(2010)

E.Remy B.Ernet J.Souli T.Vaira

"

Structure g n rale des classes Qt

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

E.Remy B.Ernet J.Souli T.Vaira

(2010)

10

Arborescence des classes Qt


La classe QWidget :

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)

E.Remy B.Ernet J.Souli T.Vaira

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

E.Remy B.Ernet J.Souli T.Vaira

(2010)

12

Principes de fonctionnement

Instanciation de la classe QApplication

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)

E.Remy B.Ernet J.Souli T.Vaira

13

Compilation : ligne de commande

La gnration d'une application se fait en plusieurs tapes :

cration d'un rpertoire et des sources (dpend de l'EDI utilis)


le nom initial du rpertoire dtermine le nom du projet et donc de l'excutable qui sera produit.

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

E.Remy B.Ernet J.Souli T.Vaira

(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

E.Remy B.Ernet J.Souli T.Vaira

(2010)

15

Exemple Fichier Projet


# ------------------------------------------------# Project created by QtCreator 2010-10-03T09:33:45 # ------------------------------------------------TARGET = Chronometre TEMPLATE = app SOURCES += main.cpp \ chronometreihm.cpp \ cchronometre.cpp HEADERS += chronometreihm.h \ cchronometre.h FORMS += chronometreihm.ui

E.Remy B.Ernet J.Souli T.Vaira

(2010)

16

Widgets parent et enfant

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) :

E.Remy B.Ernet J.Souli T.Vaira

(2010)

Widgets parent et enfant


#include <QApplication> #include <QLabel> #include <QPushbutton> int main( int argc, char* argv[] ) { QApplication MonAppli( argc, argv ); QWidget *pMaFenetre = new QWidget(); //position horizontale et verticale de la fenetre, puis dimensions de la 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); pMaFenetre->show(); return MonAppli.exec(); }

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)

E.Remy B.Ernet J.Souli T.Vaira

1!

Hi rarchie des widgets

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 ajouter des widgets dans un layout void QLayout::addWidget(QWidget *widget)

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

E.Remy B.Ernet J.Souli T.Vaira

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

E.Remy B.Ernet J.Souli T.Vaira

(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)

E.Remy B.Ernet J.Souli T.Vaira

21

Signaux et slots

Signaux

Mais on peut aussi forcer l'mission l'aide de la mthode


emit nomSignal(parametreSignal);

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);

E.Remy B.Ernet J.Souli T.Vaira

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

E.Remy B.Ernet J.Souli T.Vaira

(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

E.Remy B.Ernet J.Souli T.Vaira

(2010)

24

Signaux et slots

Dconnexion

une connexion signal/slot peut tre supprime, par la mthode :

bool QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method )

Vue gnrale

E.Remy B.Ernet J.Souli T.Vaira

(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(); }

L'ajout de cette ligne permet de rendre actif le bouton


E.Remy B.Ernet J.Souli T.Vaira
(2010)

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)

E.Remy B.Ernet J.Souli T.Vaira

Gestion m moire

Exemple :
Chose.h
#include "Chose.h"

#include <QObject> #include <iostream> using namespace std;

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

E.Remy B.Ernet J.Souli T.Vaira

(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

A.Existe(); aA->Existe(); bA->Existe(); aaA->Existe(); baA->Existe(); abA>Existe(); aaaA->Existe(); return 0; }

E.Remy B.Ernet J.Souli T.Vaira

(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); };

E.Remy B.Ernet J.Souli T.Vaira

(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(); }

E.Remy B.Ernet J.Souli T.Vaira

(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, }

E.Remy B.Ernet J.Souli T.Vaira

(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));

E.Remy B.Ernet J.Souli T.Vaira

(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)

E.Remy B.Ernet J.Souli T.Vaira

34

Documentation

Quelques autres sources d'informations mritant le dtour :

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/

Liste des Tps : http://pluton.up.univ-mrs.fr/eremy/Ens/LPSIL.Qt/


(2010)

E.Remy B.Ernet J.Souli T.Vaira

35

Vous aimerez peut-être aussi