Vous êtes sur la page 1sur 74

Concepts fondamentaux

Introduction

Qt ? Quest-ce ? <1>
Qt (cute) est un ensemble de bibliothques (librairies),
permettant (en C++) de dvelopper des applications avec des
composants graphiques (GUI)
Qt est compltement orient objet
Son dveloppement dbut en 1994, et sa commercialisation
en 1995-1996 par la firme Trolltech
Qt est portable et disponible sur plusieurs plateformes :
MS/Windows 95, 98, NT 4.0, ME, 2000, et XP
Unix/X11 Linux, Sun Solaris, HP-UX, Compaq Tru64
UNIX, IBM AIX, SGI IRIX, . . .
Macintosh Mac OS X
Embedded Linux platforms with framebuffer support

Racheter fin 2008 par Nokia

L3 - Info

Dveloppement dinterfaces graphiques

Concepts fondamentaux

Introduction

Qt ? Quest-ce ? <2>
Qt est disponible sous plusieurs licences :
Qt Enterprise Edition et Qt Professional Edition destins
aux dveloppements but commerciaux
Qt Open Source Edition disponible pour Unix/X11,
Macintosh et Embedded Linux. Cette version est distribue
avec la Q Public License et la GNU General Public License
pour les dveloppements libres.

Son plus bel exemple dapplication dans le monde du libre est


sans doute lenvironnement KDE (http://www.kde.org)
Il existe quelques bindings pour dautres langages tels que
Perl et Python et C#

L3 - Info

Dveloppement dinterfaces graphiques

Concepts fondamentaux

Introduction

O se documenter ?
Les livres :
Le livre de rfrence en anglais <<C++ GUI Programming
with Qt 4, Second Edition
La premire version et la seconde version du livre sont
disponible en ligne sur : http://www.qtrac.eu
Un livre en franais : Qt4 et C++ : Programmation
dinterfaces GUI

Sur le Web :
Le site officiel de Nokia : http://doc.qt.nokia.com/
Un site daide et de tutoriaux en franais :
http://www.qtfr.org
Un forum daide : http://www.qtforum.org

L3 - Info

Dveloppement dinterfaces graphiques

Concepts fondamentaux

Introduction

Un survol des possibilits de Qt <1>


Les applications Qt possdent un look and feel natif sur
toutes les plateformes supportes
Pour le portage entre les systmes les plus connus (Linux,
Windows, Mac OS X, . . . ) une simple recompilation est
ncessaire
Le portage peut aussi tre effectu pour des environnements
embarqus
Qt intgre le support de la 3D grce des composants
OpenGL
Qt utilise lUnicode et possde des composants ddis
linternationalisation (QString, Qt Linguist)

L3 - Info

Dveloppement dinterfaces graphiques

Concepts fondamentaux

Introduction

Un survol des possibilits de Qt <2>


Qt permet lutilisation de SGBD, indpendamment de la
plateforme dutilisation. Il est compatible notamment avec :
Oracle, SQLite, PostgreSQL, MySQL, . . .
Qt inclut un grand nombre de classes spcialises pour un
domaine ; il permet notamment la gestion directe du XML
grce des parseurs SAX et DOM
Qt inclue aussi des classes ddies aux fonctionnalits rseaux
et supporte les protocoles standard
Qt fournit sa propre implmentation de la STL pour les
compilateurs qui nen seraient pas pourvus
Pour faciliter la cration des applications, le programme Qt
Designer permet de crer rapidement les interfaces
lmentaires
L3 - Info

Dveloppement dinterfaces graphiques

Concepts fondamentaux

Introduction

Un survol des possibilits de Qt <3>

Pour tendre Qt de nouveaux composants et fonctionnalits,


Qt propose un systme dextension (Meta Object System)
et un compilateur (Meta Object Compiler (MOC)) qui
permettent daugmenter la puissance de la bibliothque
Pour faciliter la cration des Makefiles et autres fichiers de
compilation, Qt propose loutil qmake qui gnre tous les
fichiers ncessaires compilation propre

L3 - Info

Dveloppement dinterfaces graphiques

Concepts fondamentaux

Introduction

Le modle objet de Qt
Qt est bas autour du modle dobjet de Qt
Son architecture est entirement fonde sur la classe QObject
et de loutil moc
En drivant des classes de QObject, un certain nombre
davantages sont hrits :
Gestion facile de la mmoire
Signaux et Slots
Proprits
Introspection

Qt, cest uniquement du C++ standard avec quelques macros


(do la portabilit)

L3 - Info

Dveloppement dinterfaces graphiques

10

Concepts fondamentaux

Introduction

La gestion facile de la mmoire

En crant une instance dune classe drive de QObject, il est


possible de passer un pointeur vers un objet parent au
constructeur
Quand un parent est supprim, ses enfants sont supprims
aussi
Il ne faut donc pas dtruire manuellement les enfants !

L3 - Info

Dveloppement dinterfaces graphiques

11

Concepts fondamentaux

Introduction

Exemple
class VerboseObject : public QObject
{
public:
VerboseObject(QObject *parent=0)
: QObject(parent)
{ std::cout << "Created" << std::endl; }
~VerboseObject()
{ std::cout << "Deleted: " << objectName().toStdString() <<
std::endl; }
void doStuff()
{ std::cout << "Do stuff: " << objectName().toStdString() <<
std::endl; }
};

L3 - Info

Dveloppement dinterfaces graphiques

12

Concepts fondamentaux

Introduction

Exemple
int main( int argc, char **argv )
{
QApplication a( argc, argv );
VerboseObject top( 0 );
top.setObjectName("top");
VerboseObject *x = new VerboseObject( &top );
x->setObjectName("x");
VerboseObject *y = new VerboseObject( &top );
y->setObjectName("y");
VerboseObject *z = new VerboseObject( x );
z->setObjectName("z");
top.doStuff();
x->doStuff();
X
y->doStuff();
z->doStuff();
return 0;
}

TOP

L3 - Info

Dveloppement dinterfaces graphiques

13

Concepts fondamentaux

Introduction

Exemple

TOP

$ ./mem
Created
Created
Created
Created
Do stuff: top
Do stuff: x
Do stuff: y
Do stuff: z
Deleted: top
Deleted: x
Deleted: z
Deleted: y

Si la rfrence du parent est enleve de x et de y, une fuite de


mmoire se produit
L3 - Info

Dveloppement dinterfaces graphiques

14

Concepts fondamentaux

Les widgets

Larbre dobjets
Tous les QObjects sorganisent sous forme darbre
Lors de la cration dun QObject avec un parent, le fils est
ajout la liste children() du parent (destruction en
cascade)
La classe QWidget est la base de tous les composants
affichables sur lcran
Un QWidget contenant tous ses enfants : le fils dun QWidget
ne peut pas sortir des limites graphiques de son parent

Les fonctions statiques QObject::dumpObjectTree() et


QObject::dumpObjectInfo() sont souvent utiles au
dbogage de lapplication

L3 - Info

Dveloppement dinterfaces graphiques

16

Concepts fondamentaux

Les widgets

Arbre des principaux objets


QObject

QWidget

QCoreApplication

QApplication

QDialog

QFrame

QComboBox

QLabel

La classe QApplication permet interfacer lapplication avec


le systme : chaque application en possde une et une
seule !
QApplication implmente la boucle principale dvnements
Lobjet QApplication a besoin dun composant principal sur
lequel renvoyer les vnements capturs
L3 - Info

Dveloppement dinterfaces graphiques

17

Concepts fondamentaux

Les widgets

Utilisation des widgets


Qt fournit un panel complet de widgets
Les widgets de Qt ne sont pas spars en controls et
containers ; chaque widget peut tre utilis comme
control et container
Tout widget adapt (personnalis) est cr par hritage dun
widget existant
Un widget peut contenir plusieurs widgets fils :
Les widgets fils ne peuvent safficher en dehors du parent

Un widget sans parent est un top-level (racine) widget


Un widget peut tre positionn de manire automatique,
grce aux layout managers (gestionnaire de placement) ou
manuellement
Quand un widget est dsactiv, cach ou dtruit, la mme
action est applique rcursivement ses enfants
L3 - Info

Dveloppement dinterfaces graphiques

18

Concepts fondamentaux

Les widgets

Premier exemple dapplication


Exemple (Le hello world !)
#include <Qt/QtGui>
int main( int argc, char **argv )
{
QApplication app( argc, argv );
QLabel hello( "<font color=blue>Hello <i> \
world!</i> </font>", 0 );
hello.show();
return app.exec();
}

L3 - Info

Dveloppement dinterfaces graphiques

19

Concepts fondamentaux

Les widgets

Remarques sur lexemple


Lapplication cre sa propre fentre et appelle la boucle
infinie de capture dvnements
La boucle de capture des vnements est incluse dans lappel
app.exec()

Les vnements sont capturs par lapplication, il ne reste


qu leur associer des ractions aux widgets
Remarques sur les widgets :
Chaque classe commence par un Q
Pour chaque classe correspond un fichier de dclarations
inclure
Consquence : la liste des fichiers inclure augmente
rapidement . . .

L3 - Info

Dveloppement dinterfaces graphiques

20

Concepts fondamentaux

Les widgets

Les widgets utilisateur courants <1>


Pour concevoir une interface graphique, il faut connatre les
widgets courants de la librairie graphique utilise :
Widget
QLabel
QCheckBox
QLCDNumber
QLineEdit
QTextEdit
QListView
QMenu
QProgressBar
QPushButton

L3 - Info

Description
Affiche du texte et des images
Une bote cocher avec une tiquette
Afficheur digital
Une simple ligne ddition
Version plus riche, multi-ligne du widget prcdent
Une liste dlments une colonne (peut tre scrolle)
Tous les types de menus (normaux, pop up)
Barre de progression pour les oprations longues
Bouton cliquer (avec du texte ou une image)

Dveloppement dinterfaces graphiques

21

Concepts fondamentaux

Les widgets

Les widgets utilisateur courants <2>

Widget
QRadioButton
QScrollBar
QSlider
QSpinBox
QToolButton
QWhatsThis

L3 - Info

Description
Bouton radio (on/off en cercle) avec tiquette
Barre de dfilement horizontale ou verticale
Barre de niveau horizontale ou verticale
Bote de saisie avec des flches haut/bas
Un bouton cliquer format pour les barres doutils
Fournit une fentre dinformations sur les widgets

Dveloppement dinterfaces graphiques

22

Concepts fondamentaux

Les widgets

Les widgets utiliss pour grouper des widgets


Widget
QFrame
QGroupBox
QHBoxLayout
QVBoxLayout
QMenuBar
QToolBar
QMainWindow
QDialog

L3 - Info

Description
Classe de base pour les widgets avec frames
Groupe horizontalement ou verticalement
les lments dans un cadre (ligne)
Groupe horizontalement les lments sans frame
Groupe verticalement les lments sans frame
Barre contenant les menus
Barre contenant des boutons spcifiques
Grande fentre principale plus menus et barre de boutons
Frame qui apparait en popup contenant dautres widgets

Dveloppement dinterfaces graphiques

23

Concepts fondamentaux

Les widgets

Gestionnaire de placement - Layout Manager


Un des problmes lors de la conception dune interface
graphique concerne le placements des widgets :
Le placement initial
Le comportement lorsque la fentre sagrandit ou se rtrcit

Pour viter ces problmes : utiliser un Layout Manager


Qt propose deux types de layout managers :
QBoxLayout qui range les widgets soit verticalement
(QVBoxLayout) soit horizontalement (QHBoxLayout)
QGridLayout qui range les widgets comme dans un tableau

Les classes QXXLayout drivent directement de QObject, ce


ne sont pas des widgets !
La classe QBox permet de ranger les widgets, mais lors dun
agrandissement ou rtrcissement de la fentre, les widgets ne sont
pas replacs.
L3 - Info

Dveloppement dinterfaces graphiques

24

Concepts fondamentaux

Les widgets

Les QBoxLayout <1>


Reoit la place que prend le widget parent et le divise en petit
carrs destins contenir les widgets placer
QBoxLayout est trs rarement utilis, on utilise plutt les
classes QHBoxLayout et QVBoxLayout qui en hritent
directement
Les widgets sont rangs selon lordre dans lequel ils sont
ajouts au layout
Il est possible de passer au constructeur un entier qui
initialisera le nombre de cases prvues au dpart
Les layouts peuvent tre imbriqus grce la mthode
addLayout ou encore en linitialisant avec un layout comme
parent

L3 - Info

Dveloppement dinterfaces graphiques

25

Concepts fondamentaux

Les widgets

Les QBoxLayout <2>


Exemple
#include <Qt/QtGui>
int main (int argc, char* argv[])
{QApplication app(argc, argv);
QWidget w;
QHBoxLayout * hbox_1 = new QHBoxLayout(&w);
QPushButton *b1 = new QPushButton("Un", &w);
QPushButton *b2 = new QPushButton("Deux", &w);
hbox_1->addWidget(b1);
hbox_1->addWidget(b2);
w.show();
return app.exec();
}

L3 - Info

Dveloppement dinterfaces graphiques

26

Concepts fondamentaux

Les widgets

Le QGridLayout
Un QGridLayout divise lespace comme un tableau o chaque
cellule est identifiable par son numro de ligne et de colonne
(dbutant 0)
Le nombre de lignes et de colonnes sadapte en fonction des
widgets placs
Il existe plusieurs constructeurs permettant notamment de
dfinir initialement le nombre de lignes et de colonnes
Les cases vides sont acceptes
La largeur minimale dune colonne peut tre dfinie avec :
setColumnMinimumWidth( int col, int space )
La hauteur minimale dune ligne peut tre dfinie avec :
setRowMinimumHeight( int row, int space )

L3 - Info

Dveloppement dinterfaces graphiques

27

Concepts fondamentaux

Les widgets

Exemple
#include <Qt/QtGui>
int main (int argc, char* argv[])
{QApplication app(argc, argv);
QWidget w;
QGridLayout *grid = new QGridLayout(&w);
QPushButton *b1 = new QPushButton("Un", &w);
QPushButton *b2 = new QPushButton("Deux", &w);
QPushButton *b3 = new QPushButton("Trois", &w);
grid->addWidget(b1,0,0);
grid->addWidget(b2,0,1);
grid->addWidget(b3,1,0,1,2);
w.show();
return app.exec();
}

L3 - Info

Dveloppement dinterfaces graphiques

28

Concepts fondamentaux

Les widgets

Les proprits des widgets utilises par le layout manager


<1>
Les widgets intgrent des proprits qui dterminent leur
comportement lors de leur placement et dimensionnement
Exemple : la taille des boutons

Les proprits de redimensionnement (taille) sont


personnalisables grce la classe QSizePolicy
Les espacements entre widgets peuvent tre modifis :
Soit en spcifiant des marges dans les layouts
(setMargin(int) et setSpacing(int))
Soit en utilisant ponctuellement les mthodes
addSpacing(int) et insertSpacing(int,int) ajoutant un
espace dans le layout
L3 - Info

Dveloppement dinterfaces graphiques

29

Concepts fondamentaux

Les widgets

Les proprits des widgets utilises par le layout manager


<2>
Lorsque lon souhaite que ce soit les espacements qui varient
et non pas la taille des widgets on peut utiliser des lastiques
Les mthodes addStretch(int) et
insertStretch(int,int) permettent dajouter un lastique
un widget avec un poids pass en paramtre
Toutes les commandes dlastiques vues sadaptent aussi sur
les QGridLayout en utilisant les mthodes : setRowStretch,
et setColumnStretch

L3 - Info

Dveloppement dinterfaces graphiques

30

Concepts fondamentaux

Les signaux et les slots

Introduction
Toute application (graphique) doit permettre de traiter les
vnements
Exemple : le clic sur un bouton dclenche la fermeture de
lapplication

Pour cela, Trolltech a cr pour Qt une solution appele


signals and slots
Les signaux et slots sont des mcanismes gnriques de
communication inter-objets
Ils sont utiliss pour remplacer les anciens mcanismes de
callbacks :
Un callback consiste en un pointeur sur une fonction pass
un bouton (par exemple) qui est appele lorsque que le bouton
est cliqu
Aucune vrification du typage par le compilateur !
Il est difficile de dvelopper des classes gnriques
indpendantes des vnements quelles traitent
L3 - Info

Dveloppement dinterfaces graphiques

32

Concepts fondamentaux

Les signaux et les slots

Fonctionnement <1>

L3 - Info

Dveloppement dinterfaces graphiques

33

Concepts fondamentaux

Les signaux et les slots

Fonctionnement <2>
Un signal est mis quand un vnement se produit
Un slot est une mthode (ou fonction) appele en rponse
un signal particulier
Qt intgre un grand nombre de slots prdfinis, mais il est
possible de crer ses propres slots (et signaux)
Le mcanisme des signaux et slots est type-safe , et les
erreurs de typage sont reportes comme avertissement lors de
la compilation
La mthode QObject::connect permet dassocier un slot
un signal
Les connexions peuvent tre ajoutes et enleves nimporte
quel moment durant lexcution

L3 - Info

Dveloppement dinterfaces graphiques

34

Concepts fondamentaux

Les signaux et les slots

Fonctionnement <3>
Toutes les classes hritant de QObject peuvent contenir des
signaux et des slots
Il est possible de connecter un signal plusieurs slots, et
plusieurs signaux un seul slot :

L3 - Info

Dveloppement dinterfaces graphiques

35

Concepts fondamentaux

Les signaux et les slots

Exemple

Exemple
#include <Qt/QtGui>
int main (int argc, char* argv[])
{
QApplication app(argc, argv);
QPushButton bouton("Fermer", 0);
QObject::connect( &bouton, SIGNAL( clicked() ), &app,
SLOT( quit() ));
bouton.show();
return app.exec();
}

L3 - Info

Dveloppement dinterfaces graphiques

36

Concepts fondamentaux

Les signaux et les slots

Les signaux
Les signaux sont mis par un objet lorsque son tat change
Seules les classes dfinissant un signal peuvent mettre ce
signal

Remarque
Les signaux sont dclars, mais ils ne sont jamais implments
dans le .cpp ! Leur implmentation est gnre automatiquement
par le moc (Meta Object Compiler).
Le concepteur peut mettre un signal particulier grce au mot
clef emit
Quand un signal est mis, les slots connects sont excuts
immdiatement
Si plusieurs slots sont connects un signal, leur ordre
dexcution est arbitraire !
L3 - Info

Dveloppement dinterfaces graphiques

37

Concepts fondamentaux

Les signaux et les slots

Les slots

Un slot est appel ds que le signal connect est mis


Comme les slots sont des mthodes normales, ils possdent les
mmes droits que dautres mthodes classiques
Comme les autres attributs dune classe, les slots peuvent tre
dclars private, protected et public
Les slots peuvent aussi tre virtuels (virtual)
Les slots sont plus lents que les fonctions de callback ,
mais la diffrence nest pas dcelable par lutilisateur

L3 - Info

Dveloppement dinterfaces graphiques

38

Concepts fondamentaux

Les signaux et les slots

Crer ses propres signaux et slots <1>

Les signaux et slots dfinis dans Qt ne sont pas suffisants


Qt propose des solutions pour dfinir ses propres signaux et
slots, mais attention
Il nest pas possible de dfinir une classe qui ne contient que
des slots ou des signaux
Les signaux et slots ne peuvent tre dclars que dans des
classes qui hritent de QObject
Dans toute classe dfinissant des signaux ou slots, il faut
placer la macro Q_OBJECT
Les paramtres par dfaut ne sont pas utilisables pour les
signaux et les slots

L3 - Info

Dveloppement dinterfaces graphiques

39

Concepts fondamentaux

Les signaux et les slots

Crer ses propres signaux et slots <2>


Dfinition
class MyClass : public QObject
{
Q_OBJECT // Macro ncessaire
signals: // Signaux dfinis manuellement
void signal1( int, const char * );
private slots: // Slots privs dfinis manuellement
void slot1( QString &qStr );
public slots: // Slots publics dfinis manuellement
void slot2( );
private: // Mthodes et attributs privs
public: // Mthodes et attributs publiques
};

L3 - Info

Dveloppement dinterfaces graphiques

40

Concepts fondamentaux

Les signaux et les slots

Crer ses propres signaux et slots <3>


Cette classe est diffrente dune classe C++ standard
Elle hrite obligatoirement de QObject
Elle fait appel la macro Q_OBJECT
De nouveaux mots clefs apparaissent : signals, private
slots, ...
Les mthodes dfinies dans les sections slots retournent
obligatoirement le type void

Ce type de classe ne peut pas tre compil avec le compilateur


C++ habituel :
Il est ncessaire dutiliser en premier lieu le compilateur moc
moc remplace tous les mots clefs spcifiques par des
commandes et appels C++ implmentant le comportement
voulu de lobjet

L3 - Info

Dveloppement dinterfaces graphiques

41

Concepts fondamentaux

Les signaux et les slots

Crer ses propres signaux et slots


Exemple

Exemple
Fichier .h
class Foo : public QObject
{
Q_OBJECT
public:
Foo();
int value() const {return val;}
public slots:
void setValue( int );
signals:
void valueChanged( int );
private:
int val;
};

L3 - Info

Fichier .cpp

void Foo::setValue(int v)
{
if ( v != val ) {
val = v;
emit valueChanged(v);
}
}

Dveloppement dinterfaces graphiques

42

Concepts fondamentaux

Les signaux et les slots

Crer ses propres signaux et slots


Exemple (suite)

Exemple
Foo a, b;
connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
b.setValue( 11 ); // a == indfini b == 11
a.setValue( 79 ); // a == 79 b == 79
b.value(); // renvoie 79

L3 - Info

Dveloppement dinterfaces graphiques

43

Dvelopper avec et pour Qt

Prsentation des outils


Qt est fourni avec un grand nombre doutils graphiques ou en
ligne de commande pour acclrer les phases de
dveloppement :
qtconfig - permet de modifier des paramtres communs
toutes les applications Qt
Qt Designer - permettant de dessiner les widgets en mode
graphique
Qt Linguist, lupdate et lrelease - utiliss pour la traduction
des messages de lapplication dveloppe
Qt Assistant - un outil graphique daide sur Qt
qmake - charg de crer des Makefiles appropris
qembed - permettant la conversion de fichiers images (par
exemple) en code C++
rcc - permet dincorporer des donnes extrieures (icnes,
images, . . . ) la compilation
moc - le Meta Object Compiler
uic - le User Interface Compiler
L3 - Info

Dveloppement dinterfaces graphiques

45

Dvelopper avec et pour Qt

Les fonctionnalits de dboggage <1>


Messages davertissements :
qDebug( const char * msg, ... ) qui affiche un message
de dboggage
qWarning( const char * msg, ... ) qui affiche un
avertissement
qFatal( const char * msg, ... ) qui affiche un message
derreur puis quitte lapplication

Toutes ces fonctions affichent leur message sur la sortie


derreur standard (sous Unix) : stderr
Il est aussi possible de rediriger et reformater les sorties de ces
fonctions grce lutilisation de qInstallMsgHandler

L3 - Info

Dveloppement dinterfaces graphiques

46

Dvelopper avec et pour Qt

Exemple
void myMessageOutput( QtMsgType type, const char *msg )
{ switch ( type ) {
case QtDebugMsg:
cerr << "Debug: " << msg << endl;
break;
case QtWarningMsg:
cerr << "Warning: " << msg << endl;
break;
case QtFatalMsg:
cerr << "Fatal: " << msg << endl;
abort(); // core dump dlibr
}
}
...
qInstallMsgHandler( myMessageOutput );
qDebug("Teste dboggage !!");

qInstallMsgHandler(0) restaure le traitement initial


L3 - Info

Dveloppement dinterfaces graphiques

47

Dvelopper avec et pour Qt

Les fonctionnalits de dboggage <3>


Qt fournit aussi des macros : Q_ASSERT(b) et
Q_CHECK_PTR(p)
Q_ASSERT(b) ou b est un boolen crit un assert si b est faux
Q_CHECK_PTR(p) ou p est un pointeur crit un avertissement
si p est nul

Exemple
char *alloc( int size )
{
Q_ASSERT( size > 0 );
char *p = new char[size];
Q_CHECK_PTR( p );
return p;
}

L3 - Info

Dveloppement dinterfaces graphiques

48

Dvelopper avec et pour Qt

Qt Assistant et Qt Linguist <1>

Qt Assistant est un outil daide pour la documentation de Qt


Qt Linguist et ses petits outils (lrelease et lupdate)
permettent de traduire simplement le texte dune application
Qt
L3 - Info

Dveloppement dinterfaces graphiques

49

Dvelopper avec et pour Qt

Qt Assistant et Qt Linguist <2>

L3 - Info

Premirement, il faut crer un fichier projet.pro contenant la


liste des fichiers de langue traiter

Puis il faut utiliser loutil lupdate qui extrait du code source


le texte traduire

Ensuite, laide Qt linguist, traduire le texte

Enfin excuter la commande lrelease qui gnre les fichiers


traduits prts lemploi

Dveloppement dinterfaces graphiques

50

Dvelopper avec et pour Qt

Exemple
#include <Qt/QtGui>
int main( int argc, char **argv )
{ QApplication app( argc, argv );
QTranslator translator( 0 );
translator.load( "tt1_la", "." );
app.installTranslator( &translator );
QPushButton hello( QPushButton::tr("Hello world!"), 0 );
hello.show();
return app.exec();
}

Exemple (Fichier projet : traduc.pro)


SOURCES
TRANSLATIONS

L3 - Info

= traduc.cpp
= tt1_la.ts

Dveloppement dinterfaces graphiques

51

Dvelopper avec et pour Qt

Qt Designer et le User Interface Compiler (uic)

Qt Designer permet de dessiner laide de la souris linterface


graphique de lapplication
Le rsultat est sauvegard dans un fichier xml lextension .ui
Le User Interface Compiler (uic) transforme les fichiers .ui
gnr par Qt designer pour les transformer en fichiers sources
ou enttes C++
L3 - Info

Dveloppement dinterfaces graphiques

52

Dvelopper avec et pour Qt

le Meta Object Compiler (moc) <1>


Le Meta Object Compiler (moc) permet de pr-compiler les
extensions dveloppes pour Qt
Il pr-compile tout fichier contenant des instructions du
meta object system , i.e :
Le fichier doit contenir la macro Q_OBJECT
Possibilit dajouter des slots ou des signaux aux classes
hritant de QObject
Possibilit dajouter des proprits aux objets aux classes
hritant de QObject
Possibilit dutiliser tr() (internationalisation) directement sur
la classe QObject
Utilisation des macros : Q_PROPERTY, Q_ENUMS,
Q_CLASSINFO, Q_INTERFACES et Q_FLAGS
...

L3 - Info

Dveloppement dinterfaces graphiques

53

Dvelopper avec et pour Qt

le Meta Object Compiler (moc) <2>


Le rsultat produit par le moc doit tre li avec le reste des
fichiers compils pour produire le programme excutable
Mthode A : les instructions du meta object system se
trouve dans un fichier myclass.h. Le rsultat de lexcution du
moc doit tre crit dans un fichier nomm moc_myclass.cpp
qui devra tre compil et li comme dhabitude
Mthode B : les instructions du meta object system se
trouve dans un fichier myclass.cpp. Le rsultat de lexcution
du moc doit tre crit dans un fichier nomm myclass.moc.
Ce fichier doit tre inclus la fin du fichier myclass.cpp
(#include "myclass.moc") qui sera compil comme
dhabitude
La mthode normale est bien sr la mthode A !
Il est conseill de lire le manuel du moc car il existe des
limitations et des cas particuliers
L3 - Info

Dveloppement dinterfaces graphiques

54

Dvelopper avec et pour Qt

qmake <1>
qmake est un outil permettant dautomatiser la gnration des
makefiles pour des applications Qt :
Prise en compte du moc, du uic et dautres spcificits Qt

qmake utilise un fichier dinformation (.pro) pour gnrer les


makefiles appropris

Exemple (fichier monprojet.pro)


SOURCES = hello.cpp
SOURCES += main.cpp
HEADERS = hello.h
CONFIG += qt warn_on release

Excution : qmake -o Makefile monprojet.pro

L3 - Info

Dveloppement dinterfaces graphiques

55

Dvelopper avec et pour Qt

qmake <2>
Exemple (fichier monprojet.pro)
SOURCES = hello.cpp
SOURCES += main.cpp
HEADERS = hello.h
CONFIG += qt warn_on release

qt indique qmake que lapplication est construite pour Qt


(ajout des librairies et des rpertoires dincludes)
warn_on indique qmake que les warnings du compilateur
seront affichs
release indique qmake que lapplication compile est
ddie la diffusion. Le programmeur peut remplacer
release par debug
Il faut toujours utiliser le += pour la partie CONFIG car il ne
faut pas effacer les options dj existantes
L3 - Info

Dveloppement dinterfaces graphiques

56

Dvelopper avec et pour Qt

qmake <3>
qmake permet dajouter des parties spcifiques chaque
plateforme et de tester certaines conditions comme lexistance
dun fichier

Exemple (fichier hello.pro)


CONFIG += qt debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
win32 {
SOURCES += hellowin.cpp
} unix {
SOURCES += hellounix.cpp
}
!exists( main.cpp ) {
error( "No main.cpp file found" )
}
L3 - Info

Dveloppement dinterfaces graphiques

57

Composants avancs

Fonctionnalits diverses

Les fichiers <1>


Qt peut charger et sauvegarder des fichiers au format texte,
xml et binaires
Qt gre les fichiers locaux grce ses propres composants et
les fichiers distants en utilisant les protocoles ftp et http
Qt manipule les fichiers comme des objets de la classe QFile
QFile peut tester lexistence dun fichier, louvrir, tester si il
est dj ouvert, le fermer et leffacer
Les modes douvertures sont : QIODevice::ReadOnly,
QIODevice::WriteOnly, QIODevice::ReadWrite,
QIODevice::Append, ...

L3 - Info

Dveloppement dinterfaces graphiques

60

Composants avancs

Fonctionnalits diverses

Exemple
#include <Qt/QtGui>
#include <iostream>
int main( int argc, char **argv )
{QApplication a( argc, argv );
QFile f( "f.txt" );
if( !f.exists() )
{ std::cout << "Le fichier nexiste pas." << std::endl;
return 0;
}
if( !f.open( QIODevice::ReadOnly ) )
{ std::cout << "chec lors de louverture." << std::endl;
return 0;
}
std::cout << "Ca marche." << std::endl;
f.close();
return 0;
}

L3 - Info

Dveloppement dinterfaces graphiques

61

Composants avancs

Fonctionnalits diverses

Les fichiers et les flux

Un fichier seul ne sert pas grand chose, Qt propose des


classes de flux prenant un fichier comme entre :
QTextStream : permet de grer des fichiers textes
QDataStream : permet de grer des fichiers binaires

QDataStream peut aussi tre utilis pour srialiser des


objets
Les classes QTextStream et QDataStream peuvent agir avec
nimporte quelle objet issu dune sous-classe de QIODevice :
QFile, QBuffer et QTcpSocket

L3 - Info

Dveloppement dinterfaces graphiques

62

Composants avancs

Fonctionnalits diverses

Exemple
QFile file( "splash.dat" );
if ( file.open(QIODevice::WriteOnly) )
{
QDataStream out( &file );
out << QString( "SplashWidgetStyle" )
<< QFont( "Times", 18, QFont::Bold ) << QColor( "skyblue" );
file.close()
}
QString str;
QFont font;
QColor color;
QFile file2( "splash.dat" );
if ( file2.open(QIODevice::ReadOnly) )
{
QDataStream in( &file2 );
in str font color;
file2.close()
}

L3 - Info

Dveloppement dinterfaces graphiques

63

Composants avancs

Fonctionnalits diverses

Les zones dfilables


Pour afficher un objet de grande taille, il faut utiliser des
barres de dfilement : QScrollbar
Pour faciliter lutilisation de ces barres, Qt propose la classe
QScrollArea
La structure dun QScrollArea est la suivante :
Un widget afficher
Deux barres de dfilement (horizontale et verticale)

Il est possible daccder directement aux diffrents lments


composant le QScrollArea (barre horizontale et verticale)
Les barres de dfilement peuvent apparatre au besoin ou en
permanence. Cela dpend de la politique des barres de
dfilement

L3 - Info

Dveloppement dinterfaces graphiques

64

Composants avancs

Fonctionnalits diverses

Exemple
#include <Qt/QtGui>
class MyWidget : public QWidget
{ public:
MyWidget(QWidget* parent = 0) : QWidget(parent)
{ resize(1024,1024); }
Exemple (Suite)
protected:
void paintEvent(QPaintEvent*)
int main (int argc, char* argv[])
{ QPainter p(this);
{ QApplication app(argc, argv);
p.setPen(Qt::NoPen);
MyWidget w;
for (int i=0 ; i<256
; i++)
QScrollArea
scrollArea;
for (int j=0 ; j<256
; j++)
scrollArea.setWidget(&w);
{ p.setBrush(QColor(255,i,j));
scrollArea.resize(200, 200);
p.drawRect(i*4,j*4,4,4);
scrollArea.show();
}
return app.exec();
}
}
};

L3 - Info

Dveloppement dinterfaces graphiques

65

Composants avancs

Fonctionnalits diverses

Illustration dun QScrollArea

L3 - Info

Dveloppement dinterfaces graphiques

66

Composants avancs

Redfinition de widgets et dvnements avec Qt

Quand les slots et signaux ne suffisent plus

Lorsque lon veut crer/tendre un widget, la solution des


signaux et slots est parfois insuffisante
Il faut grer les vnements plus finement, au plus prs du
widget de manire redfinir son comportement
Dans ce but, Qt permet de manipuler des objets issus de
sous-classes de la classe QEvent
Les vnements peuvent tre reus et grer par tout objet issu
dune sous-classe de QObject, mais sont intressant surtout
dans le cas des widgets

L3 - Info

Dveloppement dinterfaces graphiques

68

Composants avancs

Redfinition de widgets et dvnements avec Qt

Comment sont reus les vnements


Quand un vnement est reu, Qt cre un objet instance de la
sous-classe approprie de QEvent
Cet objet est ensuite pass au widget destination par lappel
sa mthode event()
Cette mthode ne traite pas directement lvnement, mais
excute la mthode de gestion approprie en fonction du type
de lvnement reu
Elle renvoie une rponse rendant compte du traitement ou du
refus de lvnement
Certains vnements comme QMouseEvent et QKeyEvent
sont mis par le systme, dautres comme QTimerEvent
proviennent dautres sources ou programmes

L3 - Info

Dveloppement dinterfaces graphiques

69

Composants avancs

Redfinition de widgets et dvnements avec Qt

Les types dvnements

La plupart des vnements ont leur classe de traitement :


QResizeEvent, QPaintEvent, QMouseEvent, QKeyEvent,
QCloseEvent, . . .
Chaque sous-classe comporte des fonctions spcifiques
adaptes lvnement traite : QResizeEvent comprend les
mthodes size() et oldSize() pour permettre aux widgets
de connatre lvolution de leur taille
Certaines classes comme QMouseEvent peuvent grer
plusieurs vnements (le click, le double click, . . . )

L3 - Info

Dveloppement dinterfaces graphiques

70

Composants avancs

Redfinition de widgets et dvnements avec Qt

Gestion des vnements <1>


Habituellement, un vnement est trait par lappel dune
mthode virtuelle : QPaintEvent est gr lors de lappel la
mthode paintEvent()
Cette mthode est responsable du traitement de lvnement,
toutefois, il est parfois ncessaire de faire appel aux classes de
bases pour finir la gestion dun vnement

Exemple
void MyCheckBox::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
// Gre le click gauche ici
} else {
// Les autres clicks sont passs la classe de base
QCheckBox::mousePressEvent(event);
}
}
L3 - Info

Dveloppement dinterfaces graphiques

71

Composants avancs

Redfinition de widgets et dvnements avec Qt

Gestion des vnements <2>

Il arrive quil ny est pas de classe spcifique pour la gestion


de lvnement ou quelle soit insuffisante
Cest le cas de la touche "tabulation" qui ne doit pas tre
intercepte par un widget de texte mais par le widget suprieur
Dans ce cas, il est possible de redfinir la mthode event()
pour prendre en compte ce cas et appeler la mthode de
gestion approprie
La mthode event() renvoie true pour indiquer que
lvnement a bien t trait

L3 - Info

Dveloppement dinterfaces graphiques

72

Composants avancs

Redfinition de widgets et dvnements avec Qt

Gestion des vnements <3>


Exemple
bool MyWidget::event(QEvent *event)
{
if (event->type() == QEvent::KeyPress) {
QKeyEvent *ke = static_cast<QKeyEvent *>(event);
if (ke->key() == Qt::Key_Tab) {
// Ici, gestion particulire du tab
return true;
}
} else if (event->type() == MyCustomEventType) {
MyCustomEvent *myEvent=static_cast<MyCustomEvent *>(event);
// Ici, gestion particulire dun vnement
return true;
}
return QWidget::event(event);
}

QWidget::event() est appel pour les cas non traits


L3 - Info

Dveloppement dinterfaces graphiques

73

Composants avancs

Redfinition de widgets et dvnements avec Qt

Filtrer les vnements <1>


Il est parfois utile dintercepter les vnements destins un
autre objet
La mthode installEventFilter() permet dinstaller un
filtre sur un objet interceptant tous les vnements destins
un de ses descendants
Lorsquun filtre est install, la mthode eventFilter() est
excute chaque vnement transitant par lobjet
La mthode removeEventFilter() enlve un filtre existant
La mthode eventFilter() renvoie true pour stopper la
progression de lvnement, et false sinon
Si tous les eventFilter() renvoient false, lvnement
parvient lobjet destination

L3 - Info

Dveloppement dinterfaces graphiques

74

Composants avancs

Redfinition de widgets et dvnements avec Qt

Filtrer les vnements <2>


Exemple
bool FilterObject::eventFilter(QObject *object, QEvent *event)
{
if (object == target && event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_Tab) {
// Cas particulier du tab
return true;
} else
return false;
}
return false;
}

Il est possible dintercepter/filtrer tous les vnements en


plaant un filtre sur lobjet QApplication ou
QCoreApplication
L3 - Info

Dveloppement dinterfaces graphiques

75

Composants avancs

Redfinition de widgets et dvnements avec Qt

Crer ses vnements


Dans beaucoup dapplications, il faut crer ses propres
vnements
Pour crer son propre vnement, il faut :
Lui attribuer un identifiant plus grand que QEvent
U:ser
Sous-classer la classe QEvent afin dimplmenter les
comportements spcifiques

Il est possible de poster ses vnements en utilisant les


mthodes de classes QCoreApplication::sendEvent() et
QCoreApplication::postEvent()
sendEvent() transmet lvnement immdiatement qui est
trait avant que la mthode ne se termine

L3 - Info

Dveloppement dinterfaces graphiques

76

Composants avancs

Redfinition de widgets et dvnements avec Qt

Envoyer des vnements


postEvent() transfre lvnement dans la file dvnements
de lapplication
la prochaine itration de la boucle principale dvnements
de Qt, lvnement sera trait
Cela permet Qt de raliser certaines optimisations

Exemple
Si plusieurs vnements de redimensionnement sont mis, alors Qt
les compresse en un seul et appelle la mthode paintEvent une
seule fois vitant que lapplication se redessine plusieurs fois
inutilement.

Remarque
La mthode update() applique un widget << poste
lvnement QPaintEvent dans la file dvnements de
lapplication.
L3 - Info

Dveloppement dinterfaces graphiques

77

Composants avancs

La gestion des images et graphiques avec Qt

Introduction

Qt fournit un excellent support de la 2D et de la 3D


Les classes graphiques 2D de Qt grent les images bitmap et
vectorielles
Elles grent aussi les images animes et la dtection de
collisions
Qt permet dcrire du texte au format Unicode et dappliquer
des transformations sur les objets (rotation, . . . )
Qt gre aussi la 3D en proposant des classes relies
directement sur la bibliothque dOpenGL

L3 - Info

Dveloppement dinterfaces graphiques

79

Composants avancs

La gestion des images et graphiques avec Qt

Les images
La classe QImage permet de grer en entre et en sortie un
grand nombre de format dimages dont : BMP, GIF, JPEG,
MNG, PNG, PNM, XPM et XBM
Certains widgets de Qt peuvent afficher directement des
images, cest le cas des boutons, tiquettes, menus, . . .

Exemple
QPushButton *button = new QPushButton( "Chercher", parent );
button->setIcon( QIcon("find.png") );

QImage permet dutiliser la transparence si elle est gre par


le format du fichier
La classe QMovie permet de manipuler les images animes
L3 - Info

Dveloppement dinterfaces graphiques

80

Composants avancs

La gestion des images et graphiques avec Qt

Dessiner avec Qt <1>


La classe QPainter fournit les primitives de dessin ainsi que
des fonctionnalits avances comme les transformations et le
clipping
Tous les objets Qt se dessinent en utilisant QPainter
Fonctionnalits :
Dessin : points, lignes, polygones, ellipses, arcs de cercle,
bzier, . . .
Transformations : translation, rotation, mise lchelle,
cisaillement
Clipping : union, intersection, soustraction et XOR

Le coin en haut gauche est localis aux coordonnes (0, 0)


et le coin en bas droite aux coordonnes
(width() 1, height() 1)

L3 - Info

Dveloppement dinterfaces graphiques

81

Composants avancs

La gestion des images et graphiques avec Qt

Exemple
void paintEvent( QPaintEvent * )
{QPainter painter( this );
draw_bar( &painter, 0, 39, Qt::DiagCrossPattern );
draw_bar( &painter, 2, 44, Qt::FDiagPattern );
painter.setPen( Qt::black );
painter.drawLine( 0, 0, 0, height() - 1 );
painter.drawLine( 0, height() - 1, width() - 1, height() - 1 );
painter.setFont( QFont("Helvetica", 18) );
painter.drawText(rect(),Qt::AlignHCenter | Qt::AlignTop,"Ventes");
}
void draw_bar( QPainter *painter, int month, int barHeight,
Qt::BrushStyle pattern )
{
painter->setPen( Qt::blue );
painter->setBrush( QBrush(Qt::darkGreen, pattern) );
painter->drawRect( 10 + 30 * month, height() - barHeight, 20,
barHeight );
}

L3 - Info

Dveloppement dinterfaces graphiques

82

Composants avancs

La gestion des images et graphiques avec Qt

Les diffrents dispositif sur lesquels dessiner


QPainter peut agir sur nimporte quel dispositif de dessin :
Un QImage est un composant non affich lcran. Le dessin
effectu dans un QImage est ensuite recopi bit bit sur un
widget, cest la technique du double buffering
Un QPicture est une image pouvant tre dessine notamment
avec un QPainter. Il peut ensuite tre sauvegard dans un
fichier image
Un QPrinter reprsente un priphrique dimpression. Sous
windows il utilise le gestionnaire dimpression windows, sous
unix du PostScript est envoy au dmon dimpression
Un QWidget est aussi un dispositif de dessin comme vu dans
lexemple prcdent

L3 - Info

Dveloppement dinterfaces graphiques

83

Composants avancs

La gestion des images et graphiques avec Qt

Le dessin 3D
OpenGL est une API (Application Program Interface) utilise
pour dessiner des scnes 3D
Les programmeurs Qt peuvent utiliser la 3D dans leur
application de la manire suivante :
Utiliser (ou sous-classer) la classe QGLWidget qui hrite de
QWidget
Dessiner avec les fonctions standard OpenGL plutt quavec un
QPainter

Le module OpenGL utilis par Qt est disponible sur les


plateformes Windows, X11 et Macintosh et utilise soit
linstallation OpenGL systme soit la bibliothque Mesa

L3 - Info

Dveloppement dinterfaces graphiques

84