Académique Documents
Professionnel Documents
Culture Documents
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
L3 - Info
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.
L3 - Info
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
Concepts fondamentaux
Introduction
L3 - Info
Concepts fondamentaux
Introduction
Concepts fondamentaux
Introduction
L3 - Info
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
L3 - Info
10
Concepts fondamentaux
Introduction
L3 - Info
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
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
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
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
L3 - Info
16
Concepts fondamentaux
Les widgets
QWidget
QCoreApplication
QApplication
QDialog
QFrame
QComboBox
QLabel
17
Concepts fondamentaux
Les widgets
18
Concepts fondamentaux
Les widgets
L3 - Info
19
Concepts fondamentaux
Les widgets
L3 - Info
20
Concepts fondamentaux
Les widgets
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)
21
Concepts fondamentaux
Les widgets
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
22
Concepts fondamentaux
Les widgets
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
23
Concepts fondamentaux
Les widgets
24
Concepts fondamentaux
Les widgets
L3 - Info
25
Concepts fondamentaux
Les widgets
L3 - Info
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
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
28
Concepts fondamentaux
Les widgets
29
Concepts fondamentaux
Les widgets
L3 - Info
30
Concepts fondamentaux
Introduction
Toute application (graphique) doit permettre de traiter les
vnements
Exemple : le clic sur un bouton dclenche la fermeture de
lapplication
32
Concepts fondamentaux
Fonctionnement <1>
L3 - Info
33
Concepts fondamentaux
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
34
Concepts fondamentaux
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
35
Concepts fondamentaux
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
36
Concepts fondamentaux
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
37
Concepts fondamentaux
Les slots
L3 - Info
38
Concepts fondamentaux
L3 - Info
39
Concepts fondamentaux
L3 - Info
40
Concepts fondamentaux
L3 - Info
41
Concepts fondamentaux
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);
}
}
42
Concepts fondamentaux
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
43
45
L3 - Info
46
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 !!");
47
Exemple
char *alloc( int size )
{
Q_ASSERT( size > 0 );
char *p = new char[size];
Q_CHECK_PTR( p );
return p;
}
L3 - Info
48
49
L3 - Info
50
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();
}
L3 - Info
= traduc.cpp
= tt1_la.ts
51
52
L3 - Info
53
54
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
L3 - Info
55
qmake <2>
Exemple (fichier monprojet.pro)
SOURCES = hello.cpp
SOURCES += main.cpp
HEADERS = hello.h
CONFIG += qt warn_on release
56
qmake <3>
qmake permet dajouter des parties spcifiques chaque
plateforme et de tester certaines conditions comme lexistance
dun fichier
57
Composants avancs
Fonctionnalits diverses
L3 - Info
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
61
Composants avancs
Fonctionnalits diverses
L3 - Info
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
63
Composants avancs
Fonctionnalits diverses
L3 - Info
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
65
Composants avancs
Fonctionnalits diverses
L3 - Info
66
Composants avancs
L3 - Info
68
Composants avancs
L3 - Info
69
Composants avancs
L3 - Info
70
Composants avancs
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
71
Composants avancs
L3 - Info
72
Composants avancs
73
Composants avancs
L3 - Info
74
Composants avancs
75
Composants avancs
L3 - Info
76
Composants avancs
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
77
Composants avancs
Introduction
L3 - Info
79
Composants avancs
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") );
80
Composants avancs
L3 - Info
81
Composants avancs
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
82
Composants avancs
L3 - Info
83
Composants avancs
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
L3 - Info
84