Warren PAULUS Robin GODEFROID. C++ - Interface Graphique avec Visual Studio 2010



Documents pareils
Le langage C. Séance n 4

Introduction à Eclipse

Tutoriel code::blocks

Installation et paramétrage de Fedora dans VirtualBox.

Netstorage et Netdrive pour accéder à ses données par Internet

Guide de l utilisateur. Faites connaissance avec la nouvelle plateforme interactive de

Modéliser ses fenêtres avec Qt Designer

wxwidgets dans un environnement Microsoft Windows

Modifier les propriétés d'un widget

Silhouette Studio Leçon N 2

Assistance à distance sous Windows

WinTask x64 Le Planificateur de tâches sous Windows 7 64 bits, Windows 8/ bits, Windows 2008 R2 et Windows bits

Tutoriel Création d une source Cydia et compilation des packages sous Linux

Tutorial pour l installation et l utilisation de CREO et de Windchill

Installation et compilation de gnurbs sous Windows

Apprendre Java et C++ avec NetBeans

FICHIERS ET DOSSIERS

Manuel de l utilisateur

Tutorial Terminal Server sous

MO-Call pour les Ordinateurs. Guide de l utilisateur

Créer et partager des fichiers

INSTALLATION ET PRISE EN MAIN

Installation de Windows 2003 Serveur

Comment installer un client Rivalis Devis factures

Suite logicielle ZOOM version 7.1 Guide d installation 94ZM-ZMJ1F-712

1) Installation de Dev-C++ Téléchargez le fichier devcpp4990setup.exe dans un répertoire de votre PC, puis double-cliquez dessus :

Premiers Pas avec OneNote 2013

sommaire Archives... Archiver votre messagerie... Les notes... Les règles de messagerie... Les calendriers partagés Les listes de diffusions...

Construire des plug-ins pour SAS Management Console SAS 9.1

FAQ Trouvez des solutions aux problématiques techniques.

Configurer un réseau domestique. Partager ses fichiers, ses dossiers et ses imprimantes sur tous ses PC.

Guide d installation de MySQL

l'ordinateur les bases

Comment intégrer des images dans un texte

Utilisation de l éditeur.

INSTALLATION DBSWin En réseau

Avant-propos FICHES PRATIQUES EXERCICES DE PRISE EN MAIN CAS PRATIQUES

CAPTURE DES PROFESSIONNELS

GESTION DU LOGO. 1. Comment gérer votre logo? Format de l image Dimensions de l image Taille de l image 9

Initiation à l informatique. Module 7 : Le courrier électronique ( , mail)

Procédures d'utilisation de Maitre'D

Préconisations Techniques & Installation de Gestimum ERP

IBM SPSS Collaboration and Deployment Services Deployment Manager 5 - Instructions d installation

HAYLEM Technologies Inc.

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

Leçon N 5 PICASA Généralités

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

TD/TP 1 Introduction au SDK d Android

Eclipse atelier Java

La Clé informatique. Formation Excel XP Aide-mémoire

Gérer ses fichiers et ses dossiers avec l'explorateur Windows. Février 2013

Guide de démarrage IKEY 2032 / Vigifoncia

Mon aide mémoire traitement de texte (Microsoft Word)

Démarrer et quitter... 13

Tutoriaux : Faites vos premiers pas avec Microsoft Visio 2010

Certificats Electroniques sur Clé USB

Créer sa première base de données Access Partie 4/4 - Création d un état

Guide d installation et d utilisation

Troisième projet Scribus

Setting Up PC MACLAN File Server

INSTALLATION DE WINDOWS 2000 SERVER POUR BCDI3. par. G.Haberer, A.Peuch, P.Saadé

Procédure d installation d AMESim 4.3.0

Itium XP. Guide Utilisateur

Accès au Serveur de PAIE «SPV» par INTERNET Paramétrage du poste de travail «Windows»

Volet de visualisation

Ceci est un Chromebook, ton ordinateur!

Tropimed Guide d'installation

Windows Server 2008 R2

Adobe Photoshop. Bonnes pratiques pour une utilisation professionelle CHAPITRE 7

Votre premier projet Android

LECON 2 : PROPRIETES DE L'AFFICHAGE Version aout 2011

COMMENT INSTALLER LE SERVEUR QIPAIE

Réparer un disque dur passé en RAW

SQL Server Installation Center et SQL Server Management Studio

PROCÉDURE D'INSTALLATION WINDOWS 7 (32 ou 64 bit)

Sauvegarde des données d affaires de Bell Guide de démarrage. Vous effectuez le travail Nous le sauvegarderons. Automatiquement

Guide de configuration. Logiciel de courriel

Installation et prise en main

Utiliser Dev-C++ .1Installation de Dev-C++ Table des matières

Procédure d installation pour WinEUR PROCÉDURE D INSTALLATION POUR WINEUR. Copyright GIT SA 2015 Page 1/16

Fonction Memory Viewer

Oracle Developer Suite 10g. Guide de l installation. Vista & Seven

RECOPLUS LOGICIEL DE GESTION DES RECOMMANDES NOTICE D UTILISATION DE RECOPLUS RESEAU. N de série

145A, avenue de Port Royal, Bonaventure (Québec) G0C 1E0 Sans frais :

Comment configurer Kubuntu

Réparer un disque dur passé en RAW

TwinCAT 3 C++ Création de modules C++ sous TwinCAT 3 VERSION : 1.0 / PH

Certificats Electroniques sur Clé USB

Access 2007 FF Access FR FR Base

ENVOI EN NOMBRE DE MESSAGES AUDIO

Installation d un ordinateur avec reprise des données

LOGICIEL KIPICAM : Manuel d installation et d utilisation

1 CRÉER UN TABLEAU. IADE Outils et Méthodes de gestion de l information

INITIATION A L INFORMATIQUE. MODULE : Initiation à l'environnement Windows XP. Table des matières :

Universal Robots. Fiche Méthode : Installation du simulateur Polyscope

Suite Messerli Gest (gestion de chantier) Prestations (imputations des heures) Procédure d'installation du programme ou d'une mise à jour

Administration de Parc Informatique TP07 : Installation de Linux Debian

Créer sa première base de données Access Partie 3/4 - Création d un formulaire

Transcription:

C++ - Interface Graphique avec Visual Studio 2010 2010/2011

Mise à jour 1.2 : Installation réussie avec Qt 4.7.3. - Ajout d éléments supplémentaires sur le fonctionnement de «QsplashScreen». - Ajout d éléments supplémentaires sur le fonctionnement de «QFtp». - Ajout d éléments supplémentaires sur «Qt Designer». Mise à jour 1.1 : - Ajout d éléments supplémentaires sur le fonctionnement de «Qt», «FmodEx», «OpenCv», «LibHaru» et «VideoInput» dans un projet «MakeFile» avec Visual Studio 2010. - Application concernant QDebug dans un projet «MakeFile». - Utilisation de Qthread dans un projet. - Modification de la partie «Qt» - «Configuration de Visual Studio 2010» et «Layout». Numérisation Interactive de Partitions 2 Version 1.2 du document

Voici un tutorial sur la création d interfaces graphiques avec Visual Studio 2010. Logiciels nécessaires : - Visual Studio 2010 Premium/Ultimate (par exemple) ; - Qt ; 1) Application Windows Forms Le lecteur de ce document ne rencontrera aucun problème s il a déjà élaboré des interfaces graphiques avec Java. Par contre, les «Application Windows Forms» ne fonctionnent pas avec OpenCV. Nous avons donc dû constituer une bibliothèque graphique en visitant les sites ci-dessous : - Qt ; http://trolltech.com/products/qt - Gtk ; http://www.gtk.org/ - WxWidgets. http://www.wxwidgets.org/ Création d une application : - Créer un nouveau projet en allant dans «Fichier», «Nouveau», puis «Projet». - Aller dans «Visual C++», puis sélectionner : «Application Windows Forms». Choisir un nom pour le projet et cliquer sur «OK». - Une fenêtre va s ouvrir, ce sera la fenêtre de notre application. - On peut apercevra, en bas à droite, une zone appelée «Propriété» : elle permet de changer les propriétés de la fenêtre. Il est très facile d effectuer des essais pour comprendre les différentes fonctions disponibles. On peut changer le nom, la taille, de «Forms». - Si la «Boite à outils» n est pas disponible, aller dans «Affichage», «Boite à outils». Alors, on verra apparaitre tout ce qu il faut pour remplir «Forms». - Positionner un bouton dans «Forms». Dès que cela a été fait, il suffit de changer quelques paramètres. Changeons son Name afin de lui donner un nom qui va nous permettre de le reconnaître. Pour information : Il faut toujours nommer les boutons comme ceci : «B_Nom» ; c est aussi vrai pour les labels «L_Nom», etc - Voici ce que cela doit donner : Numérisation Interactive de Partitions 3 Version 1.2 du document

Mise en marche de la programmation : Afin de pouvoir programmer, il suffit d entrer dans le code en faisant un clic droit et ensuite de cliquer sur «Afficher le code». Code this->formborderstyle = System::Windows::Forms::FormBorderStyle::FixedDialog; this->text = "NIP"; this->startposition = FormStartPosition::CenterScreen; this->controlbox = false Infos ^inf = gcnew Infos(); inf->showdialog(); Explication Permet de changer les propriétés de la fenêtre afin de la fixer pour ne pas pouvoir la modifier Permet de donner un nom à la fenêtre Positionne la fenêtre au centre de l'écran Afin d'enlever l'agrandissement, le rétrécissement et la fermeture de la fenêtre On crée un nouvel objet de la fenêtre Infos Et on affiche cet objet donc la fenêtre Infos Pour information : Quand on veut afficher un «int» dans un label, ne jamais oublier la fonction «Convert :: ToString(votre int)». Voilà le type d erreur que l on a en rajoutant OpenCV à l application «Windows Form» : 2) Qt Télécharger Qt sur le site officiel «http://qt.nokia.com/downloads», dans la partie «LPGL». Comme nous travaillons sous «Windows», nous allons télécharger la version «Qt libraries 4.7.2 for Windows (VS 2008, 218 MB)» et l installer. Nous l avons installée dans le répertoire «C:\Qt\4.7.2». L installation a été réalisée aussi avec Qt 4.7.3. Paramétrage de Qt avec Visual Studio 2010 : Sous Vista / 7. Aller dans Panneau de Configuration -> Système -> Paramètres système avancés -> onglet Paramètres système avancés. Cliquer sur Variables d'environnement. Sous XP Aller dans Panneau de configuration -> Système -> onglet Avancé. Cliquer sur Variables d'environnement. Dans la partie supérieure de la fenêtre, créons deux nouvelles variables. Cliquer sur Nouvelle... Dans Nom de la variable entrer : QMAKESPEC, et, dans Valeur de la variable, écrire : win32-msvc2010. Cette variable va indiquer à qmake quel compilateur utiliser, pour créer les bons makefile. Idem pour la deuxième variable qui a pour nom QTDIR et pour valeur le chemin d'installation de Qt. Par défaut, c'est Numérisation Interactive de Partitions 4 Version 1.2 du document

C:\Qt\4.7.2. Cette variable est nécessaire au compilateur pour savoir où chercher les fichiers sources. A ce moment de notre démarche, on devrait avoir ceci : On va devoir ensuite modifier une autre variable : la variable «PATH» qui se trouve toujours dans la partie «Variable utilisateur». Et donc rajouter «;%QTDIR%\bin\» à la suite. Ceci pour pouvoir utiliser les différentes commandes de Qt (qmake, uic,...) en ligne de commande sans avoir à aller dans le dossier contenant les exécutables. Pour être sûr que ces modifications des variables d'environnement sont bien prises en compte, ouvrir la console de Windows (démarrer -> Accessoires -> Invite de commandes) et taper : echo %QTDIR% puis : echo %QMAKESPEC% et enfin : echo %path%. On devrait lire ce que nous avons entré précédemment. Si ce n'est pas le cas, redémarrez votre ordinateur et revérifier. Maintenant il va falloir lancer l invite de commande de Visual Studio 2010 qui ce se trouve dans «Tous les programmes» «Microsoft Visual Studio 2010» «Visual Studio Tools» et enfin «Invite de commandes de Visual Studio (2010)» que vous soyez en 64 bits ou en 32 bits! A l heure actuelle, il y a quelques soucis avec Visual Studio 2010 pour compiler QT en 64 bits. Voici l erreur que nous avons eue lorsqu on a voulu lancer le programme final sur Visual Studio : fatal error LNK1112: type d'ordinateur module 'x64' en conflit avec le type d'ordinateur cible 'X86' Voici la démarche à suivre : La première configuration sert à préparer le terrain à la compilation. Cette commande peut mettre de 10 à 30 minutes pour se terminer. C'est avec cette commande qu'on peut spécifier le compilateur à utiliser avec l'option -platform (nous l'avons fait avec la variable d'environnement QMAKESPEC, qui est utilisée par défaut) ainsi que le mode de compilation : en «debug» ou en «release». On a compilé en «debug». En effet, si on compile en release, on ne peut pas débugger notre programme... Numérisation Interactive de Partitions 5 Version 1.2 du document

En ce qui concerne la seconde congiguration, nmake lance la compilation proprement dite. Tous les fichiers sont ainsi compilés avec le compilateur de Visual Studio. C'est durant cette opération que qmake, Qt Designer et les autres logiciels habituellement fournis sont compilés. C'est la phase la plus longue : de 2 à 4 heures. Enfin, la dernière commande, nmake clean sert à supprimer tous les fichiers générés lors de la compilation, et il y en a un paquet : pas moins de 3 giga-octets! Elle dure environ 10 à 20 minutes. Cela peut prendre quelques heures sur certains ordinateurs moins performants. Cela a duré un peu moins de 6 heures avec un ordinateur portable muni d un processeur Dual Core 2,2Ghz Il se peut qu il y ait des warnings mais ce n est pas grave. Configuration de Visual Studio 2010 : Lancer un nouveau projet «Makefile» en C++. Cliquer sur «Suivant». Voici ce qu il faut faire : Dans «Ligne de commande Rebuild» et «Build», on a : «qmake -project & qmake & nmake». Ne pas oublier d écrire «Debug\» sinon il y aura une erreur lors du lancement de : Débogages. Pour information : On peut aussi écrire «qmake & nmake» dans la partie «Build» car si on doit modifier le fichier.pro pour rajouter des «Libs» externes par exemple, le programme va écraser le fichier.pro si on laisse «qmake project». Cliquer sur «Suivant». Voici ce qu il faut faire : Dans «Ligne de commande Rebuild» ne pas oublier d écrire «Release\». Cliquer sur «Terminer». Numérisation Interactive de Partitions 6 Version 1.2 du document

Configuration du Projet : Faire un clic droit sur Projet en mode Debug (pas Release), ensuite «Propriété», puis sur «Répertoires VC++», ensuite cliquer sur qui se trouve dans la partie «Répertoire d exécutable», puis «Modifier». Cette fenêtre va apparaitre : Rechercher le répertoire de «Qt» pour les éxécutables donc, le répertoire «bin» qui se trouve dans «C:\Qt\4.7.2\bin». Faire de même pour les autres Répertoires «d includes» (C:\Qt\4.7.2\include) et «bibliothèques» (C:\Qt\4.7.2\lib). Voilà le résultat : Ou bien utiliser la variable d environnement «$(QTDIR)» par exemple «$(QTDIR)\bin». Cliquer sur «Appliquer», puis sur «OK». Faire un clic droit sur «Fichiers sources», ensuite «Ajouter», puis «Nouvelle élément...» Créé un fichier.cpp Dès que cela a été fait, compléter par : #include <QtGui/qapplication.h> #include <QtGui/qpushButton.h> int main(int argc, char *argv[]) QApplication app(argc, argv); QPushButton bouton("isib!"); bouton.show(); QObject::connect(&bouton, SIGNAL(clicked()), &app, SLOT(quit())); return app.exec(); Numérisation Interactive de Partitions 7 Version 1.2 du document

Attendre que l ordinateur finisse d analyser les «includes». On peut ensuite lancer l application en mode «Debug» en cliquant sur le bouton «play»! Petite parenthèse : si on rencontre le type d erreur suivante : il suffira de lancer le «Build» dans le mode «Debug», il va nous créer un fichier.pro. Ensuite en mode «Release» faire un «Build» de l application. Normalement, on doit lire que : «La génération a réussi», et on verra apparaître les fichiers : Repasser ensuite en mode «Debug» et lançons notre application avec l icône «play». Voici le résultat : Programmation avec Qt : Ligne de programmation QApplication app(argc, argv); QPushButton bouton("isib!"); bouton.show() QObject::connect(&bouton, SIGNAL(clicked()), &app, SLOT(quit())); return app.exec(); Explication On crée un nouvel objet «app» de type QApplication. On a dû mettre «#include <QtGui/qapplication.h>» au début de notre programme. On crée un nouvel objet «bouton» de type QPushButton dont le texte qui sera affiché sur le bouton sera «ISIB!». On a dû mettre «#include <QtGui/qpushButton.h>» au début de notre programme Va permettre d afficher notre bouton avec la méthode show de l objet «bouton». Permet de quitter l application quand on clique sur l objet «bouton». Cette méthode statique admet plusieurs paramètres (pointeur vers l objet qui émet le signal, le type de signal à intercepter, pointeur vers l objet où se trouve le slot, le type de slot à actionner) Cette méthode exec de notre objet «app» permet de démarrer notre programme. Analysons notre objet «bouton» : Ligne de programmation Bouton.setText("Voila!"); bouton.settooltip("de l'aide"); Explication On peut changer le texte de notre objet «bouton». On peut mettre en œuvre une infobulle quand on a la souris sur l objet «bouton». QFont mapolice("courier"); bouton.setfont(mapolice); La première ligne va permettre de créer un objet «mapolice» de type QFont. La deuxième ligne permet de changer la police de notre texte de l objet «bouton» grâce à l objet «mapolice» de type QFont. Numérisation Interactive de Partitions 8 Version 1.2 du document

Si on examine plus en détail le constructeur QFont, on peut constater ceci : bouton.setcursor(qt::pointinghandcursor); bouton.seticon(qicon("smile.png")); On a donc affaire à 5 constructeurs donc une «surcharge» de constructeurs, afin de voir les différents paramètres de chaque constructeur, il suffit de cliquer sur les flèches. On peut changer la taille, mettre en italique Permet de changer le curseur quand on se positionne sur l objet «bouton». Cela permet d afficher des images sur votre objet «bouton», par exemple. On va enregistrer ce smiley et le nommer comme suit «smile.png», et le placer dans le répertoire où se trouve notre fichier.vcxproj!! Voici le résultat : On peut s amuser en allant sur le site : «http://doc.trolltech.com/4.7/classes.html». Maintenant, entrons dans le vif du sujet. Ce que l on a fait jusqu à présent c était de créer un bouton et Qt a créé une fenêtre autour de ce bouton. Voici une application (+ explications) pour créer une fenêtre dans laquelle il y aura un bouton : #include <QtGui/qapplication.h> #include <QtGui/qpushButton.h> int main(int argc, char *argv[]) QApplication app(argc, argv); // Création d'un widget qui servira de fenêtre QWidget fenetre; // On dimensionne la fenêtre fenetre.setfixedsize(300, 150); // On crée un bouton qui a comme parent la fenêtre QPushButton bouton("isib!",&fenetre); bouton.setcursor(qt::pointinghandcursor); bouton.seticon(qicon("smile.png")); // On déplace le bouton de x = 50 y = 60 bouton.move(50,60); // On affiche la fenêtre fenetre.show(); bouton.settooltip("de l'aide"); QObject::connect(&bouton, SIGNAL(clicked()), &app, SLOT(quit())); return app.exec(); Voici le résultat : Numérisation Interactive de Partitions 9 Version 1.2 du document

Voici d autres fonctions : Ligne de programmation bouton.setgeometry(50, 60, 100, 50); Explication On peut changer la localisation du bouton ainsi que sa taille. QPushButton autrebouton("autre bouton", &bouton); Cela permet de placer un bouton dans un autre bouton, car si on choisi comme paramètre &bouton alors l objet «bouton» de tout à l heure sera parent de l objet «autrebouton» ; on peut remettre &fenetre si on veut. Petite parenthèse, tout à l heure, nous avions créé des objets de type «QFont» mais nous avons oublié de rajouter les «includes»! #include <QtGui/qapplication> #include <QtGui/qpushbutton> #include <QtGui/qwidget> #include <QtGui/qfont> #include <QtGui/qicon> Notre application fonctionnait car en fait, on avait inclus QPushButton. Et comme QPushButton hérite de QWidget, il avait lui-même inclus QWidget dans son header. Quant à QFont et QIcon, ils étaient inclus eux aussi car indirectement utilisés par QPushButton. Code modulaire : On peut créer un nouveau projet Makefile (comme expliqué auparavant) ou éditer le projet actuel. En ce qui nous concerne, nous avons créé un nouveau projet «ModulaireISIB». Créons un nouveau fichier main.cpp dans la partie «Fichiers sources» qui va contenir : #include <QtGui/qapplication.h> #include "MaFenetre.h" int main(int argc, char *argv[]) QApplication app(argc, argv); MaFenetre fenetre; fenetre.show(); return app.exec(); Comme on peut le constater cela n a rien d étrange, à part une ligne! Numérisation Interactive de Partitions 10 Version 1.2 du document

Ligne de programmation Explication #include "MaFenetre.h" On va inclure un fichier.h MaFenetre fenetre ; On va créer un nouvel objet de la classe MaFenetre Il va falloir créer une nouvelle classe, ce qui veut dire créer un fichier : - MaFenetre.h (dans «Fichiers d en tête»); - MaFenetre.cpp (dans «Fichiers sources»). Dès que cela a été fait, ouvrons le fichier «MaFenetre.h» et collons tout ce qui est indiqué ci-dessous : #ifndef DEF_MAFENETRE #define DEF_MAFENETRE #include <QtGui/qapplication.h> #include <QtGui/qwidget> #include <QtGui/qpushbutton> class MaFenetre : public QWidget // On hérite de QWidget (IMPORTANT) public: MaFenetre(); ; private: QPushButton *m_bouton; #endif Explication : Ligne de programmation Explication : public QWidget Cette partie permet de dire qu on hérite de QWidget donc que notre classe MaFenetre hérite de QWidget. public: Ici on crée le constructeur de notre classe MaFenetre(); MaFenetre. Private: Ici on crée un pointeur nommé «*m_bouton» qui QPushButton *m_bouton; va devoir pointer sur un objet de type «QPushButton». Cet objet va être créé dynamiquement par la suite grâce à la fonction «new»! Ouverture du fichier «MaFenetre.h» : #include "MaFenetre.h" MaFenetre::MaFenetre() : QWidget() setfixedsize(300, 150); // Construction du bouton m_bouton = new QPushButton("ISIB!", this); m_bouton->setfont(qfont("comic Sans MS", 14)); m_bouton->setcursor(qt::pointinghandcursor); m_bouton->seticon(qicon("smile.png")); m_bouton->move(60, 50); Explication : Numérisation Interactive de Partitions 11 Version 1.2 du document

Ligne de programmation #include "MaFenetre.h" MaFenetre::MaFenetre() : QWidget() setfixedsize(300, 150); m_bouton = new QPushButton("ISIB!", this); Voici le résultat : Explication Inclure les définitions de la classe «MaFenetre::» permet de dire à quelle classe il se rapporte, «: QWidget()» sert à appeler le constructeur de QWidget. Permet de fixer les dimensions de la fenêtre. C est ici qu on va créer notre objet m_bouton avec la fonction new. Ne jamais oublier le «this» car le parent du bouton est la fenêtre! Et nous sommes dans la fenêtre! Il y a encore d autres fonctions pour les fenêtres et les boutons, par exemple : Ligne de programmation setwindowflags(qt::tool); Explication Comme on peut le constater, la fenêtre n a plus la possibilité d être agrandie ou d être réduite. fenetre.setwindowicon(qicon("image.png")); fenetre.setwindowopacity(0.8); Permet d ajouter un icone à la fenêtre, cela ne fonctionne pas en mode Qt ::Tool. fenetre.setwindowtitle("isib V 0.1"); Permet de rendre la fenêtre opaque. m_bouton->setcheckable(true); QCheckBox *checkbox = new QCheckBox("J'aime l'école", this); Permet de changer le titre de la fenêtre. Permet, quand on clique sur le bouton : qu il soit actionné et quand on reclique dessus : qu il soit relâché. Numérisation Interactive de Partitions 12 Version 1.2 du document

//Radiobouton QGroupBox *groupbox = new QGroupBox("Votre biere préféré", this); QRadioButton *orval = new QRadioButton("Orval"); QRadioButton *leffe = new QRadioButton("Leffe"); QRadioButton *jupiler = new QRadioButton("Jupiler"); orval->setchecked(true); QVBoxLayout *vbox = new QVBoxLayout; vbox->addwidget(orval); vbox->addwidget(leffe); vbox->addwidget(jupiler); On va créer un groupbox qui va contenir nos RadioButton, ceux-ci sont positionnés avec l aide d un QVBoxLayout. groupbox->setlayout(vbox); groupbox->setfixedsize(125,100); groupbox->move(5, 5); QProgressBar *isib = new QProgressBar(this); isib->setvalue(11); ProgressBar. http://doc.trolltech.com/4.7/qprogressbar.html Signaux et slots : Ceci permet de gérer les événements au sein d une fenêtre, donc : - un signal est envoyé par un Widget lorsqu un évènement se produit; - un slot est la fonction qui se produit en cas de signal (c est donc une méthode de la classe). En fait, Qt rajoute ces éléments à nos objets «Signaux et Slots». On peut aussi connecter des signaux et des slots entre eux (on peut, par exemple, connecter deux objets différents). Un signal peut aussi appeler plusieurs slots (mais l ordre d exécution n est pas contrôlé), comme un signal peut provoquer la création d un autre signal! Connexion d un signal à un slot : Nous allons élaborer un programme qui lorsqu on on va cliquer sur un bouton, cela fermera la fenêtre. Nous avons déjà mis ceci en pratique : «QObject::connect(&bouton, SIGNAL(clicked()), &app, SLOT(quit()));» Ouvrons le fichier «MaFenetre.cpp» et rajoutons cette fonction : «QObject::connect(&bouton, SIGNAL(clicked()), qapp, SLOT(quit()));» Pourquoi qapp? Car Qt crée automatiquement un pointeur vers un objet de type QApplication que nous avons créé dans le «main». Utiliser SLOT pour afficher la fenêtre «A propos de Qt». «QObject::connect(m_bouton, SIGNAL(clicked()), qapp, SLOT(aboutQt()));» Numérisation Interactive de Partitions 13 Version 1.2 du document

Pour information : On a créé un bouton avec la fonction «new», par conséquent on est sensé détruire celui-ci, mais en fait Qt s en charge pour nous. Quand on supprime un Widget parent, Qt supprime tous les Widgets à l intérieur (enfants). Voyons comment passer des paramètres entre un signal et un slot. Créons un nouveau projet. Le main.cpp reste le même tandis que MaFenetre.h : #ifndef DEF_MAFENETRE #define DEF_MAFENETRE #include <QtGui/qapplication> #include <QtGui/qwidget> #include <QtGui/qpushbutton> #include <QtGui/qlcdnumber> #include <QtGui/qslider> class MaFenetre : public QWidget public: MaFenetre(); ; private: QLCDNumber *m_lcd; QSlider *m_slider; #endif Numérisation Interactive de Partitions 14 Version 1.2 du document

MaFenetre.cpp : #include "MaFenetre.h" MaFenetre::MaFenetre() : QWidget() setfixedsize(200, 100); m_lcd = new QLCDNumber(this); m_lcd->setsegmentstyle(qlcdnumber::flat); m_lcd->move(50, 20); m_slider = new QSlider(Qt::Horizontal, this); m_slider->setgeometry(10, 60, 150, 20); Ce qui donne : Etablissons le lien entre le signal et le slot, pour cela rendons-nous sur ces sites : Voilà ce que ça donne : «http://doc.trolltech.com/4.7/qlcdnumber.html» «http://doc.trolltech.com/4.7/qslider.html» Il a fallu rajouter ceci : «QObject::connect(m_slider, SIGNAL(valueChanged(int)), m_lcd, SLOT(display(int)));» Ne nous étendons pas sur les explications concernant le programme, le plus simple afin s amuser c est de consulter la documentation relative à Qt. Création de notre propre slot : Le seul moyen de créer des slots et signaux c est que notre classe hérite de QObject : c est le cas pour nous car MaFenetre hérite de QWidget qui lui hérite de QObject. Reprenons, par exemple, le QSlider et faisons un slider qui permettra de modifier la largeur de votre fenêtre! Pour cela, créons un nouveau projet. Numérisation Interactive de Partitions 15 Version 1.2 du document

Le «main» reste le même tandis que le MaFenetre.h change : #ifndef DEF_MAFENETRE #define DEF_MAFENETRE #include <QtGui/qapplication.h> #include <QtGui/qwidget> #include <QtGui/qslider> class MaFenetre : public QWidget Q_OBJECT public: MaFenetre(); public slots: void changerlargeur(int largeur); ; private: QSlider *m_slider; #endif MaFenetre.cpp : #include "MaFenetre.h" void MaFenetre::changerLargeur(int largeur) setfixedsize(largeur, 100); MaFenetre::MaFenetre() : QWidget() setfixedsize(200, 100); m_slider = new QSlider(Qt::Horizontal, this); m_slider->setrange(200, 600); m_slider->setgeometry(10, 60, 150, 20); QObject::connect(m_slider, SIGNAL(valueChanged(int)), this, SLOT(changerLargeur(int))); Création de notre propre signal : Créons une application qui permettra de fermer la fenêtre quand on arrive à la valeur maximum du Slider. Numérisation Interactive de Partitions 16 Version 1.2 du document

MaFenetre.cpp : #include "MaFenetre.h" void MaFenetre::changerLargeur(int largeur) setfixedsize(largeur, height()); if (largeur == 600) emit agrandissementmax(); MaFenetre::MaFenetre() : QWidget() setfixedsize(200, 100); m_slider = new QSlider(Qt::Horizontal, this); m_slider->setrange(200, 600); m_slider->setgeometry(10, 60, 150, 20); QObject::connect(m_slider, SIGNAL(valueChanged(int)), this, SLOT(changerLargeur(int))); QObject::connect(this, SIGNAL(agrandissementMax()), qapp, SLOT(quit())); Ma_Fenetre.h : #ifndef DEF_MAFENETRE #define DEF_MAFENETRE #include <QtGui/qapplication.h> #include <QtGui/qwidget> #include <QtGui/qslider> class MaFenetre : public QWidget Q_OBJECT public: MaFenetre(); public slots: void changerlargeur(int largeur); signals: void agrandissementmax(); ; private: QSlider *m_slider; #endif Boite de dialogue : Créons des boîtes de dialogue : elles permettront d interagir avec l utilisateur. Numérisation Interactive de Partitions 17 Version 1.2 du document

Voici un exemple de programme : - le «main» ; #include <QtGui/qapplication.h> #include "MaFenetre.h" int main(int argc, char *argv[]) QApplication app(argc, argv); MaFenetre fenetre; fenetre.show(); return app.exec(); - MaFenetre.h ; #ifndef DEF_MAFENETRE #define DEF_MAFENETRE #include <QtGui/qapplication.h> #include <QtGui/qwidget> #include <QtGui/qmessagebox> #include <QtGui/qpushbutton> class MaFenetre : public QWidget Q_OBJECT public: MaFenetre(); public slots: void ouvrirdialogue(); ; private: QPushButton *m_boutondialogue; #endif - MaFenetre.cpp ; #include "MaFenetre.h" MaFenetre::MaFenetre() : QWidget() setfixedsize(230, 120); m_boutondialogue = new QPushButton("Ouvrir la boîte de dialogue", this); m_boutondialogue->move(40, 50); QObject::connect(m_boutonDialogue, SIGNAL(clicked()), this, SLOT(ouvrirDialogue())); void MaFenetre::ouvrirDialogue() QMessageBox::information(this, "Le titre pour l'isib", "ISIB!"); Numérisation Interactive de Partitions 18 Version 1.2 du document

Voici le résultat : Il existe différents types de «QMessageBox», voici quelques exemples : Ligne de programmation QMessageBox::warning(this, "Le titre pour l'isib", "ISIB!"); Explication QMessageBox::critical(this, "Le titre pour l'isib", "ISIB!"); QMessageBox::question(this, "Le titre pour l'isib", "ISIB!"); QMessageBox::question(this, "ISIB", "Sommes nous à l'isib?", QMessageBox::Yes QMessageBox::No); void MaFenetre::ouvrirDialogue() int reponse = QMessageBox::question(this, "ISIB", "Sommes nous à l'isib?", QMessageBox::Yes QMessageBox::No); if (reponse == QMessageBox::Yes) QMessageBox::information(this, "Interrogatoire", "Bienvenue à l'isib!"); else if (reponse == QMessageBox::No) QMessageBox::critical(this, "Interrogatoire", "Attention! Traître!\nMenteur!"); Yes -> No -> On peut aussi saisir un texte, on peut : - reprendre l ancien code et seulement modifier la partie «ouvrirdialogue»; - rajouter «#include <QtGui/QInputDialog>» dans MaFenetre.h. Ligne de programmation QString pseudo = QInputDialog::getText(this, "Votre nom à l'isib", "Quel est votre nom?"); Explication Numérisation Interactive de Partitions 19 Version 1.2 du document

bool ok = false; QString pseudo = QInputDialog::getText(this, "Votre nom à l'isib", "Quel est votre nom?", QLineEdit::Normal, QString(), &ok); if (ok &&!pseudo.isempty()) QMessageBox::information(this, "Nom", "Bonjour " + pseudo + ", ça va?"); else QMessageBox::critical(this, "Nom", "Vous n'avez pas voulu donner votre nom "); int entier = QInputDialog::getInteger(this, "Nombre", "Entrez un nombre entier"); Ok -> Cancel -> Récupération d un nombre entier : Par défaut le pas d incrémentation est de 1, si on veut changer il suffit de modifier le «step» dans les paramètres (*). double nombredecimal = QInputDialog::getDouble(this, "Nombre", "Entrez un nombre décimal"); Récupération d un nombre décimal : Idem pour les nombres entiers. * QStringList pays; pays << "France" << "Belgique" << "Suisse" << "Canada (québec)" << "Autre"; QInputDialog::getItem(this, "Votre pays", "De quel pays es-tu?", pays); bool ok = false; QFont police = QFontDialog::getFont(&ok, m_boutondialogue->font(), this, "Choisissez une police"); if (ok) m_boutondialogue->setfont(police); Cela permet de changer la font du bouton «m_boutondialogue». Ne pas oublier dans le fichier MaFenetre.h : #include <QtGui/QFontDialog> Avant : Après avec la police «MS PMincho» : Numérisation Interactive de Partitions 20 Version 1.2 du document

QColor couleur = QColorDialog::getColor(Qt::white, this); QPalette palette; palette.setcolor(qpalette::buttontext, couleur); m_boutondialogue->setpalette(palette); Ne pas oublier dans le fichier MaFenetre.h : #include <QtGui/QColorDialog> Avant : Après avec la couleur orange : QString dossier = QFileDialog::getExistingDirectory(this); QString fichier = QFileDialog::getOpenFileName(this, "Ouvrir un fichier", QString(), "Images (*.png *.gif *.jpg *.jpeg)"); QMessageBox::information(this, "Fichier", "Vous avez sélectionné :\n" + fichier); QString fichier = QFileDialog::getSaveFileName(this, "Enregistrer un fichier", QString(), "Images (*.png *.gif *.jpg *.jpeg)"); Permet de sélectionner un dossier sur le disque dur. Permet de sélectionner un fichier et de faire apparaître son emplacement dans une QMessageBox. Permet de sauvegarder un fichier sur le disque dur. Layout : Il existe plusieurs classes layout : - QBoxLayout ; - QHBoxLayout ; - QVBoxLayout ; - QGridLayout ; - QFormLayout ; - QStackedLayout. Layout Horizontal Voici le fichier main.cpp : #include <QtGui/QApplication> #include <QtGui/QPushButton> #include <QtGui/QHBoxLayout> int main(int argc, char *argv[]) QApplication app(argc, argv); QWidget fenetre; QPushButton *bouton1 = new QPushButton("Bonjour"); QPushButton *bouton2 = new QPushButton("les"); QPushButton *bouton3 = new QPushButton("Isibiens"); QHBoxLayout *layout = new QHBoxLayout; layout->addwidget(bouton1); layout->addwidget(bouton2); layout->addwidget(bouton3); fenetre.setlayout(layout); fenetre.show(); return app.exec(); Numérisation Interactive de Partitions 21 Version 1.2 du document

Voici le résultat : Explication : Ligne de programmation QHBoxLayout *layout = new QHBoxLayout; layout->addwidget(bouton1); layout->addwidget(bouton2); layout->addwidget(bouton3); fenetre.setlayout(layout); Explication On va donc créer notre layout en appelant le constructeur de la classe QHBoxLayout. On va rajouter nos Widget à l intérieur de notre layout. La fonction setlayout attend un pointeur vers le layout à utiliser. Ce qui est intéressant, c est que lorsqu on change les dimensions de la fenêtre, le layout s adapte. Qt efface lui-même les Widgets et le layout. Layout Vertical : Il faut juste remplacer le QH par QV et modifier l include, voici ce que ça donne : Layout Grille (rajouter l include QGridLayout): QGridLayout *layout = new QGridLayout; layout->addwidget(bouton1, 0, 0); layout->addwidget(bouton2, 0, 1); layout->addwidget(bouton3, 1, 0); Voilà le résultat : Layout Formulaire : #include <QtGui/QFormLayout> #include <QtGui/QLineEdit> QLineEdit *nom = new QLineEdit; QLineEdit *prenom = new QLineEdit; QLineEdit *age = new QLineEdit; QFormLayout *layout = new QFormLayout; layout->addrow("votre nom", nom); layout->addrow("votre prénom", prenom); layout->addrow("votre âge", age); Numérisation Interactive de Partitions 22 Version 1.2 du document

Voici le résultat : Pour créer des raccourcis clavier il suffit de modifier en ajoutant ceci : layout->addrow("votre &nom", nom); layout->addrow("votre &prénom", prenom); layout->addrow("votre â&ge", age); Utilisons les touches ALT + N pour arriver au champ nom. On peut constater que la lettre est soulignée : Ajouter un layout dans un autre layout #include <QtGui/QApplication> #include <QtGui/QPushButton> #include <QtGui/QFormLayout> #include <QtGui/QLineEdit> int main(int argc, char *argv[]) QApplication app(argc, argv); QWidget fenetre; // Création du layout de formulaire et de ses widgets QLineEdit *nom = new QLineEdit; QLineEdit *prenom = new QLineEdit; QLineEdit *age = new QLineEdit; QFormLayout *formlayout = new QFormLayout; formlayout->addrow("votre &nom", nom); formlayout->addrow("votre &prénom", prenom); formlayout->addrow("votre â&ge", age); // Création du layout principal de la fenêtre (vertical) QVBoxLayout *layoutprincipal = new QVBoxLayout; layoutprincipal->addlayout(formlayout); // Ajout du layout de formulaire QPushButton *boutonquitter = new QPushButton("Quitter"); QWidget::connect(boutonQuitter, SIGNAL(clicked()), &app, SLOT(quit())); layoutprincipal->addwidget(boutonquitter); // Ajout du bouton fenetre.setlayout(layoutprincipal); fenetre.show(); return app.exec(); http://doc.trolltech.com/4.7/qlineedit.html Numérisation Interactive de Partitions 23 Version 1.2 du document