Vous êtes sur la page 1sur 35

Programmationvnementielle

Prsentation Licences Dveloppement StructuregnraledeQt Premierprogramme Principes Signauxetslots Gestionmmoire

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

(2010)

Prsentation
QtestunebibliothquelogicielleorienteobjetetdveloppeenC++par QtDevelopmentFrameworks,filialedeNokia. Qtestuneplateformededveloppementdinterfacesgraphiques(GUI GraphicalUserInterface)fourniel'origineparlasocitnorvgienne TrollTech,puisracheteparNokiaenfvrier2008(http://qt.nokia.com/). Qtpermetlaportabilitdesapplicationsquin'utilisentquesescomposants parsimplerecompilationducodesource. LesenvironnementssupportssontlesUnix(dontLinux)quiutilisentle systmegraphiqueXWindowSystem,WindowsetMacOSX.les.

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

(2010)

Prsentation
Qtestprincipalementddieaudveloppementd'interfaces graphiquesenfournissantdeslmentsprdfinisappelswidgets (pourwindowsgadgets)quipeuventtreutilisspourcrerses propresfentresetdesbotesdedialoguecompltementprdfinies (ouverture/enregistrementdefichiers,progressiond'opration,etc). Qtfournitgalementunensembledeclassesdcrivantdeslments nongraphiques:accsauxdonnes,connexionsrseaux(socket), gestiondesfilsd'excution(thread),analyseXML,etc. Qtdisposed'unmoteurderendugraphique2Dperformant.

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

(2010)

Prsentation
Depuis,Qt4sparelabibliothqueenmodules: QtCore:pourlesfonctionnalitsnongraphiquesutilisesparlesautresmodules; QtGui:pourlescomposantsgraphiques; QtNetwork:pourlaprogrammationrseau; QtOpenGL:pourl'utilisationd'OpenGL; QtSql:pourl'utilisationdebasededonnesSQL; QtXml:pourlamanipulationetlagnrationdefichiersXML; QtDesigner:pourtendrelesfonctionnalitsdeQtDesigner,l'assistantdecration d'interfacesgraphiques; QtAssistant:pourl'utilisationdel'aidedeQt; Qt3Support:pourassurerlacompatibilitavecQt3. etdenombreuxautresmodules,etc. QtutiliseUnicode4.0pourlareprsentationdeseschanesdecaractres.

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

(2010)

Prsentation
Lesinteractionsaveclutilisateursontgresparunmcanisme appelsignal/slot.Cemcanismeestlabasedelaprogrammation vnementielledesapplicationsbasessurQt. Qtestnotammentconnupourtrelabibliothquesurlaquellerepose l'environnementgraphiqueKDE,l'undesenvironnementsdebureau lesplusutilissdanslemondeLinux. DeplusenplusdedveloppeursutilisentQt,ycomprisparmide grandesentreprises.Onpeutnotammentciter:Google,Adobe Systems,Asus,Samsung,Philips,ouencorelaNASAetbien videmmentNokia.
E.Remy B.Ernet J.Souli T.Vaira
(2010)

Prsentation

L'environnementdeQtestaussiconstitude:

QtJambi:lespossibilitsdeQtpourlelangageJAVA Qtopia:uneversiondeQtdestineauxdispositifsportables (tlphones,PocketPC,etc..)etauxsystmesembarqus(ex Qt/Embedded) QSA:QtScriptforApplications,ajoutdescriptssesapplications. Teambuilder:architecturedecompilationdistribuepourlesgros projetsd'entreprise.

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

(2010)

Licences
LasocitTrolltechmittoutd'abordlaversionUnix/LinuxdeQtsous licenceGNUGPLlorsquel'applicationdveloppetaitgalementsous GNUGPL.Pourlereste,c'estlalicencecommercialequientreen application.Cettepolitiquededoublelicenceestappliquepourtousles systmesdepuislaversion4.0deQt. Le14janvier2009,Trolltechannoncequ'partirdeQt4.5,Qtsera galementdisponiblesouslicenceLGPLv2.1(Licencepubliquegnrale limiteGNU).Cettelicencepermetainsidesdveloppementsdelogiciels propritaires,sansncessiterl'achatd'unelicencecommercialeauprsde QtDevelopmentFrameworks.

LeslicencesQt:http://qt.nokia.com/products/licensing/ LeslicencesGNU:http://www.gnu.org/licenses/licenses.fr.html
(2010)

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

Environnementde DveloppementIntgr
QtCreatorestl'environnementdedveloppementintgrddiQtetfacilitela gestiond'unprojetQt.Sonditeurdetexteoffrelesprincipalesfonctionsquesontla colorationsyntaxique,lecompltement,l'indentation,etc...QtCreatorintgreenson seinlesoutilsQtDesigneretQtAssistant. MmesiQtCreatorestprsentcommel'environnementdedveloppementderfrence pourQt,ilexistedesmodulesQtpourlesenvironnementsdedveloppementEclipseet VisualStudio.Ilexisted'autresEDIddisQtetdveloppsindpendammentde Nokia,commeQDevelopetMonkeyStudio. QtDesignerestunlogicielquipermetdecrerdesinterfacesgraphiquesQtdansun environnementconvivial.L'utilisateur,parglisserdposer,placelescomposants d'interfacegraphiqueetyrgleleurspropritsfacilement.Lesfichiersd'interface graphiquesontformatsenXMLetportentl'extension.ui.Lorsdelacompilation,un fichierd'interfacegraphiqueestconvertienclasseC++parl'utilitaireuic.

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

(2010)

Environnementde DveloppementIntgr
QDevelopestunenvironnementdedveloppementintgrlibrepourQt.Lebutde QDevelopestdefournirdanslesenvironnementslesplusutiliss,Linux,Windowset MacOSXd'unoutilpermettantdedvelopperenQtdelammemanireavecunIDE unique.IlintgregalementlesoutilsQtDesignerpourlacrationd'interfacegraphique etQtLinguistpourlesupportdel'internationalisation. KDevelopestunenvironnementdedveloppementintgr(IDE)pourKDE.Ilintgre galementlesoutilsQtDesignerpourlacrationd'interfacegraphiqueetQtLinguist pourlagestiondel'internationalisation. Autresbibliothquesgnralistesmultiplateformes,parmilesplusconnus:

GTK+,utiliseparl'environnementgraphiqueGNOME wxWidgets(anciennementwxWindows)
(2010)

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

Structuregnrale desclassesQt

L'APIQtestconstituedeclassesauxnomsprfixsparQetdontchaque motcommenceparunemajuscule(QLineEdit,QLabel,...). Arborescencedesobjets:LesobjetsQt(ceuxhritantdeQObject)peuvent s'organiserd'euxmmessousformed'arbre.Ainsi,lorsqu'uneclasseest instancie,onpeutluidfinirunobjetparent. LaclasseQObject:

elleestlaclassemredetouteslesclassesQt toutobjetdontlaclassehrite(directementounon)delaclasseQObject peutmettreetrecevoirunsignal ellepermetunegestionsimplifidelammoire

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

(2010)

10

ArborescencedesclassesQt
LaclasseQWidget:

ellehritedeQObject elleestlaclassemredetoutesles classesservantraliserdes interfacesgraphiques

Leswidgets:

sontcapabledese"peindre" sontcapablederecevoirlesvnementssouris,clavier sontleslmentsdebasedesinterfacesgraphiques sonttousrectangulaires ilssontordonnssuivantlaxez(gestiondelaprofondeur) ilspeuventavoirunwidgetparent


(2010)

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

11

Premierprogramme
Qt4posecommeprincipequepourutiliseruneclasse,ilfautinclureunfichierheader dunomdelaclasse.
#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(); } LaclasseQApplicationgrelesoptionsstandardsdunprogramme Qt(argc,argv)etlespropritsglobalesdelapplication: lestyledesfentres,lacouleurdufond,latailledelafentre principale laboucledcoutedesvnements larcuprationdinformationglobale(taillecran) lelangagedelapplicationinternationalisationi18n(cf.L10n, g11n) UnobjetdetypeQApplicationdoittrecravantcelledeswidgets UtiliserQCoreApplicationsilapplicationnestpasgraphique

Affichagedumessage Boucleinfinied'attentedes vnementsjusqu' lafermeturedudernierwidget

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

(2010)

12

Principesdefonctionnement

InstanciationdelaclasseQApplication

Elledoittrecreavanttoutobjetgraphiqueetreoittouslesparamtres transmislafonctionmain(argc,argv).Elles'occupedetoutelagestion desvnements(etlesenvoieauxwidgetsconcerns).Cetobjetest toujoursaccessibledansleprogrammegrceaupointeurglobalnomm qApp. Lesapplicationsdoiventseterminerproprementenappelant QApplication::quit() Cettemthodeestappeleautomatiquementlorsdelafermeturedu dernierwidget. Unwidgetesttoujourscrcach,ilestdoncncessaired'appelerla mthodeshow()pourl'afficher
(2010)

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

13

Compilation:lignedecommande

Lagnrationd'uneapplicationsefaitenplusieurstapes:

crationd'unrpertoireetdessources(dpenddel'EDIutilis)
lenominitialdurpertoiredterminelenomduprojetetdoncdel'excutable quiseraproduit.

qmakeproject
gnreunfichier.proquidcritcommentgnrerunMakefilepourcompilerce quiestprsentdansledossiercourant.

qmake[makefile]
gnreunMakefilepartirdesinformationsdufichier.pro

make
appelclassiqueloutilmake,pardfautilutiliseunfichierappelMakefile

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

(2010)

14

Qmake

QtsevoulantunenvironnementdedveloppementportableetayantleMOC commetapeintermdiaireavantlaphasedecompilation/ditiondeliens,ila tncessairedeconcevoirunmoteurdeproductionspcifique.C'estainsi qu'estconuleprogrammeqmake. Cedernierprendenentreunfichier(avecl'extension.pro)dcrivantle projet(listedesfichierssources,dpendances,paramtrespasssau compilateur,etc...)etgnreunfichierdeprojetspcifiquelaplateforme. Ainsi,souslessystmesUNIX/Linux,qmakeproduitunMakefile. Lefichierdeprojetestfaitpourtretrsfacilementditableparun dveloppeur.Ilconsisteenunesried'affectationsdevariables. Manuel:http://doc.trolltech.com/4.x/qmakemanual.html

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

(2010)

15

ExempleFichierProjet
# #ProjectcreatedbyQtCreator20101003T09: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

Widgetsparentetenfant

Hirarchie

D'unemaniregnrale,leswidgetssonthirarchiquementincluslesuns danslesautres.Leprincipalavantageestquesileparentestdplac,les enfantslesontaussi. Onvadoncajouterunboutonnotreapplicationpourobtenirceci(les deuxlmentsserontinclusdansunmmewidget):

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

(2010)

17

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

Lorsdelacrationdunwidgetonindiquelewidgetparent(icipMaFenetre).Les widgetssontalorsdessinslintrieurdelespaceattribuleurparent. Biensurceboutonn'aaucuneactioncarunepressiondessusnecrepas d'vnements,ilfaututiliserlemcanismedessignauxetslots.


(2010)

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

18

Hirarchiedeswidgets

D'unemaniregnrale,leswidgetssonthirarchiquementincluslesunsdansles autres.Leprincipalavantageestquesileparentestdplac,lesenfantslesontaussi. Lesgestionnairesdedisposition,lesclassesdeLayout,simplifientcetravail:

Onpeutajouterdeswidgetsdansunlayout

voidQLayout::addWidget(QWidget*widget)

Onpeutassocierunlayoutunwidgetquidevientalorslepropritairedulayout etparentdeswidgetsinclusdanslelayout

voidQWidget::setLayout(QLayout*layout)
QHBoxLayout QBoxLayout QVBoxLayout QFormLayout QObject QLayout QGridLayout QStackLayout

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

(2010)

19

Signauxetslots

vnements

Pourlagestiondesvnements,Qtutiliseunmcanismede communicationd'objetsfaiblementcouplsappelsignal/slot. Faiblementcouplsignifiequel'metteurd'unsignalnesaitpas quelobjetvaleprendreencompte(d'ailleurs,ilserapeuttre ignor).Delammefaon,unobjetinterceptantunsignalne saitpasquelobjetamislesignal. Toutobjetdontlaclassehrite(directementounon)dela classeQObjectpeutmettreetrecevoirunsignal.

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

(2010)

20

Signauxetslots

Signaux

Cessignauxn'ontrienvoiraveclessignauxUNIXouLinux (decommunicationinterprocessus),cesontdesvnements quisurviennentsuitedesactionsdel'utilisateur. Unsignalpeuttreconnectunautresignal.Danscecas, lorsquelepremiersignalestmis,ilentranel'missiondu second. missiond'unsignalpeuttre"automatique"parexemple lorsqu'onappuisurunbouton,lesignalexistedanslaclasse utilise.


(2010)

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


21

Signauxetslots

Signaux

Maisonpeutaussiforcerl'missionl'aidedelamthode Ladclarationd'unsignalpersonnalisestpossible,ilfaut savoirqu'iln'apasdevaleurderetour(void)etpasdecorps,le motclsignalsapparaitdanslefichierd'enttecommepublic, private...


voidnomSignal(parametreSignal);

emitnomSignal(parametreSignal);

signals:

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

(2010)

22

Signauxetslots

Slots

Lesslotstantdesmthodes,ilspeuventtreappels explicitement(sansprsenced'unvnement)commetoute mthode.Ilspeuventdonctreprivate,protectedoupublicavec lesconsquenceshabituellespourleurconnexion(privatepour laclasse...).Demme,ilspeuventtrevirtuelset/ou surchargs.Ilsontseulementlapropritd'treconnectsun signaletdanscecas,ilseraautomatiquementappellorsquele signalseramis.

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

(2010)

23

Signauxetslots

Connexion

signaletslotdoiventtrecompatibles(avoirlammesignature) pourtreconnects. unsignalpeuttreconnectplusieursslots.Attention:les slotssontactivsdansunordrearbitraire. plusieurssignauxpeuventtreconnectsunseulslot. uneconnexionsignal/slotpeuttreralise,parlamthode:


boolQObject::connect(constQObject*sender,constchar* signal,constchar*method,Qt::ConnectionTypetype= Qt::AutoConnection)const

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

(2010)

24

Signauxetslots

Dconnexion

uneconnexionsignal/slotpeuttresupprime,parlamthode:

boolQObject::disconnect(constQObject*sender,constchar* signal,constQObject*receiver,constchar*method)

Vuegnrale

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

(2010)

25

Signauxetslots

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'ajoutdecettelignepermetderendreactiflebouton
E.Remy B.Ernet J.Souli T.Vaira
(2010)

26

Gestionmmoire

Qtestbasautourdumodled'objetdeQt.Cettearchitectureest cequirendQtpuissantetfacileemployer.Elleestentirement baseautourdelaclasseQObjectetdel'outilmoc.Lesclasses graphiquesdriventtoutesdeQObject.LesQObjects'organisent euxmmesenarbred'objets.QuandoncreunQObject(unobjet graphiqueparexemple)avecunautreQObjectcommeparent, l'objetparentajoutelenouvelobjetcrsalisted'enfants. Sileparentestdtruit(appeldesondestructeur),ildtruira automatiquementtoussesenfants. Onnedtruira(oprateurdelete)doncquelesQObjectcrspar l'oprateurnewquin'ontpasdeparent.
(2010)

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

27

Gestionmmoire

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

#include<QObject> #include<iostream> usingnamespacestd;

Chose.cpp

classChose:publicQObject{ public: Chose(QObject*parent=0,char*nom=0); ~Chose(); voidExiste(); };

Chose::Chose(QObject*parent,char*nom): QObject(parent){ setObjectName(nom); cout<<"Constructeur:"<< objectName().toStdString()<<endl;} Chose::~Chose(){cout<<"Destructeur:" <<objectName().toStdString()<<endl;} voidChose::Existe(){ cout<<"Enexcution:"<< objectName().toStdString()<<endl;}

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

(2010)

28

Gestionmmoire

Exemple(suite):
main.cpp
c f a

A b d e

#include"Chose.h"

intmain(intargc,char*argv[]){ ChoseA(NULL,"A"); Chose*aA=newChose(&A,"a"); Chose*bA=newChose(&A,"b"); Chose*aaA=newChose(aA,"c"); Chose*baA=newChose(aA,"d"); Chose*abA=newChose(bA,"e"); Chose*aaaA=newChose(aaA,"f"); A.Existe();aA>Existe();bA>Existe(); aaA>Existe();baA>Existe();abA >Existe();aaaA>Existe(); return0; }

Constructeur:AConstructeur:aConstructeur:b Constructeur:cConstructeur:dConstructeur:e Constructeur:f Enexcution:AEnexcution:aEnexcution:b Enexcution:cEnexcution:dEnexcution:e Enexcution:f Destructeur:ADestructeur:aDestructeur:c Destructeur:fDestructeur:dDestructeur:b Destructeur:e

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

(2010)

29

Exemple
#include<QtGui> classConvertisseur:publicQWidget{ Q_OBJECT private: QLineEdit*valeur; QLabel*resultat; QComboBox*choix; QPushButton*bConvertir; QPushButton*bQuitter; public: Convertisseur(QWidget*parent=NULL); ~Convertisseur(); signals: voidactualiser(); privateslots: voidconvertir(); voidpermuter(intindex); };

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

(2010)

30

Exemple

#include<QApplication> #include"Convertisseur.h" intmain(intargc,char*argv[]){ QApplicationapp(argc,argv); Convertisseurconvertisseur; convertisseur.adjustSize(); convertisseur.show(); returnapp.exec();}

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

(2010)

31

Exercice
#include"Convertisseur.h" Convertisseur::Convertisseur(QWidget*parent):QWidget(parent){ valeur=newQLineEdit(this); resultat=newQLabel(this); choix=newQComboBox(this); bConvertir=newQPushButton("Convertir",this); bQuitter=newQPushButton("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(){} voidConvertisseur::convertir(){ switch(choix>currentIndex()){ case0:resultat>setText(QString::fromUtf8("%1F").arg(9*valeur>text().toDouble()/5 +32,0,'f',2));break; case1:resultat>setText(QString::fromUtf8("%1C").arg(5*(valeur>text().toDouble() 32)/9,0,'f',2));break; } } voidConvertisseur::permuter(intindex){ 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 LarfrenceQt4:http://doc.trolltech.com/4.7/index.html,etplusparticulirementles conceptsdebase(http://doc.trolltech.com/4.7/qtbasicconcepts.html): SignalsandSlots; MainClasses; MainWindowArchitecture; Internationalization(pensezcrirevotreprogrammeenanglaispuisletraduireen franais); OpenGLModule. Lesdocumentationsdesoutilsindispensables: qmake(http://doc.trolltech.com/4.7/qmaketutorial.html); QtDesigner(http://doc.trolltech.com/4.7/designermanual.html); QtLinguist(http://doc.trolltech.com/4.7/linguistmanual.html); QtCreator(http://doc.qt.nokia.com/qtcreator2.0/index.html).
(2010)

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

34

Documentation

Quelquesautressourcesd'informationsmritantledtour:

QtCentre:http://www.qtcentre.org/ QtForum(enanglais):http://www.qtforum.org/ QtFr,unsitefranais,http://www.qtfr.org/ L'IndependantQtTutorialquiestpleind'exemples(etdisponibleenfranais): http://www.digitalfanatics.org/projects/qt_tutorial/ QtApps.orgproposeunannuairedeprogrammeslibresconstruitssurQt: http://www.qtapps.org/ EtQtProp.org,l'quivalentpourlesprogrammesnonlibres(commeSkypeet GoogleEarth):http://www.qtprop.org/

ListedesTps:http://pluton.up.univmrs.fr/eremy/Ens/LPSIL.Qt/
(2010)

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

35

Vous aimerez peut-être aussi