Vous êtes sur la page 1sur 36

Warren PAULUS Robin GODEFROID

C++ - Interface Graphique avec Visual Studio 2010

2010/2011

Warren PAULUS Robin GODEFROID


Mise jour 1.2 : Installation russie avec Qt 4.7.3. Ajout dlments supplmentaires sur le fonctionnement de QsplashScreen . Ajout dlments supplmentaires sur le fonctionnement de QFtp . Ajout dlments supplmentaires sur Qt Designer . Mise jour 1.1 : Ajout dlments supplmentaires 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 .

Numrisation Interactive de Partitions

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Voici un tutorial sur la cration dinterfaces graphiques avec Visual Studio 2010. Logiciels ncessaires : Visual Studio 2010 Premium/Ultimate (par exemple) ; Qt ;

1) Application Windows Forms


Le lecteur de ce document ne rencontrera aucun problme sil a dj labor des interfaces graphiques avec Java. Par contre, les Application Windows Forms ne fonctionnent pas avec OpenCV. Nous avons donc d constituer une bibliothque graphique en visitant les sites ci-dessous : Qt ; http://trolltech.com/products/qt Gtk ; http://www.gtk.org/ WxWidgets. http://www.wxwidgets.org/

Cration dune application :


Crer un nouveau projet en allant dans Fichier , Nouveau , puis Projet . Aller dans Visual C++ , puis slectionner : Application Windows Forms .

Choisir un nom pour le projet et cliquer sur OK . Une fentre va souvrir, ce sera la fentre de notre application.

On peut apercevra, en bas droite, une zone appele Proprit : elle permet de changer les proprits de la fentre. Il est trs facile deffectuer des essais pour comprendre les diffrentes fonctions disponibles. On peut changer le nom, la taille, de Forms .

Si la Boite outils nest pas disponible, aller dans Affichage , Boite outils . Alors, on verra apparaitre tout ce quil faut pour remplir Forms . Positionner un bouton dans Forms . Ds que cela a t fait, il suffit de changer quelques paramtres. Changeons son Name afin de lui donner un nom qui va nous permettre de le reconnatre. Pour information : Il faut toujours nommer les boutons comme ceci : B_Nom ; cest aussi vrai pour les labels L_Nom , etc

Voici ce que cela doit donner :

Numrisation Interactive de Partitions

Version 1.2 du document

Warren PAULUS Robin GODEFROID

Mise en marche de la programmation :


Afin de pouvoir programmer, il suffit dentrer dans le code en faisant un clic droit et ensuite de cliquer sur Afficher le code . Code this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedDialog; Explication Permet de changer les proprits de la fentre afin de la fixer pour ne pas pouvoir la modifier Permet de donner un nom la fentre Positionne la fentre au centre de l'cran Afin d'enlever l'agrandissement, le rtrcissement et la fermeture de la fentre On cre un nouvel objet de la fentre Infos Et on affiche cet objet donc la fentre Infos

this->Text = "NIP"; this->StartPosition = FormStartPosition::CenterScreen; this->ControlBox = false Infos ^inf = gcnew Infos(); inf->ShowDialog();

Pour information : Quand on veut afficher un int dans un label, ne jamais oublier la fonction Convert :: ToString(votre int) . Voil le type derreur que lon a en rajoutant OpenCV lapplication Windows Form :

2) Qt
Tlcharger Qt sur le site officiel http://qt.nokia.com/downloads , dans la partie LPGL . Comme nous travaillons sous Windows , nous allons tlcharger la version Qt libraries 4.7.2 for Windows (VS 2008, 218 MB) et linstaller. Nous lavons installe dans le rpertoire C:\Qt\4.7.2 . Linstallation a t ralise aussi avec Qt 4.7.3.

Paramtrage de Qt avec Visual Studio 2010 :


Sous Vista / 7. Aller dans Panneau de Configuration -> Systme -> Paramtres systme avancs -> onglet Paramtres systme avancs. Cliquer sur Variables d'environnement. Sous XP Aller dans Panneau de configuration -> Systme -> onglet Avanc. Cliquer sur Variables d'environnement. Dans la partie suprieure de la fentre, crons 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 crer les bons makefile. Idem pour la deuxime variable qui a pour nom QTDIR et pour valeur le chemin d'installation de Qt. Par dfaut, c'est

Numrisation Interactive de Partitions

Version 1.2 du document

Warren PAULUS Robin GODEFROID


C:\Qt\4.7.2. Cette variable est ncessaire au compilateur pour savoir o chercher les fichiers sources. A ce moment de notre dmarche, 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 diffrentes commandes de Qt (qmake, uic, ...) en ligne de commande sans avoir aller dans le dossier contenant les excutables. Pour tre sr que ces modifications des variables d'environnement sont bien prises en compte, ouvrir la console de Windows (dmarrer -> Accessoires -> Invite de commandes) et taper : echo %QTDIR% puis : echo %QMAKESPEC% et enfin : echo %path% . On devrait lire ce que nous avons entr prcdemment.

Si ce n'est pas le cas, redmarrez votre ordinateur et revrifier. Maintenant il va falloir lancer linvite 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 lheure actuelle, il y a quelques soucis avec Visual Studio 2010 pour compiler QT en 64 bits. Voici lerreur que nous avons eue lorsquon 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 dmarche suivre :

La premire configuration sert prparer le terrain la compilation. Cette commande peut mettre de 10 30 minutes pour se terminer. C'est avec cette commande qu'on peut spcifier le compilateur utiliser avec l'option -platform (nous l'avons fait avec la variable d'environnement QMAKESPEC, qui est utilise par dfaut) 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 dbugger notre programme...

Numrisation Interactive de Partitions

Version 1.2 du document

Warren PAULUS Robin GODEFROID


En ce qui concerne la seconde congiguration, nmake lance la compilation proprement dite. Tous les fichiers sont ainsi compils avec le compilateur de Visual Studio. C'est durant cette opration que qmake, Qt Designer et les autres logiciels habituellement fournis sont compils. C'est la phase la plus longue : de 2 4 heures. Enfin, la dernire commande, nmake clean sert supprimer tous les fichiers gnrs 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 dun processeur Dual Core 2,2Ghz Il se peut quil y ait des warnings mais ce nest pas grave.

Configuration de Visual Studio 2010 :


Lancer un nouveau projet Makefile en C++.

Cliquer sur Suivant . Voici ce quil faut faire :

Dans Ligne de commande Rebuild et Build , on a : qmake -project & qmake & nmake . Ne pas oublier dcrire Debug\ sinon il y aura une erreur lors du lancement de : Dbogages. 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 quil faut faire :

Dans Ligne de commande Rebuild ne pas oublier dcrire Release\ . Cliquer sur Terminer .

Numrisation Interactive de Partitions

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Configuration du Projet :
Faire un clic droit sur Projet en mode Debug (pas Release), ensuite Proprit , puis sur Rpertoires VC++ , ensuite cliquer sur qui se trouve dans la partie Rpertoire dexcutable , puis Modifier .

Cette fentre va apparaitre :

Rechercher le rpertoire de Qt pour les xcutables donc, le rpertoire bin qui se trouve dans C:\Qt\4.7.2\bin . Faire de mme pour les autres Rpertoires dincludes (C:\Qt\4.7.2\include) et bibliothques (C:\Qt\4.7.2\lib). Voil le rsultat :

Ou bien utiliser la variable denvironnement $(QTDIR) par exemple $(QTDIR)\bin .

Cliquer sur Appliquer , puis sur OK . Faire un clic droit sur Fichiers sources , ensuite Ajouter , puis Nouvelle lment...

Cr un fichier .cpp Ds que cela a t fait, complter 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(); }

Numrisation Interactive de Partitions

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Attendre que lordinateur finisse danalyser les includes . On peut ensuite lancer lapplication en mode Debug en cliquant sur le bouton play ! Petite parenthse : si on rencontre le type derreur suivante :

il suffira de lancer le Build dans le mode Debug , il va nous crer un fichier .pro. Ensuite en mode Release faire un Build de lapplication. Normalement, on doit lire que : La gnration a russi , et on verra apparatre les fichiers :

Repasser ensuite en mode Debug et lanons notre application avec licne play . Voici le rsultat :

Programmation avec Qt :
Ligne de programmation QApplication app(argc, argv); Explication On cre un nouvel objet app de type QApplication. On a d mettre #include <QtGui/qapplication.h> au dbut de notre programme. On cre 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 dbut de notre programme Va permettre dafficher notre bouton avec la mthode show de lobjet bouton . Permet de quitter lapplication quand on clique sur lobjet bouton . Cette mthode statique admet plusieurs paramtres (pointeur vers lobjet qui met le signal, le type de signal intercepter, pointeur vers lobjet o se trouve le slot, le type de slot actionner) Cette mthode exec de notre objet app permet de dmarrer notre programme.

QPushButton bouton("ISIB !");

bouton.show() QObject::connect(&bouton, SIGNAL(clicked()), &app, SLOT(quit()));

return app.exec();

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 lobjet bouton .

QFont maPolice("Courier"); bouton.setFont(maPolice);

La premire ligne va permettre de crer un objet maPolice de type QFont. La deuxime ligne permet de changer la police de notre texte de lobjet bouton grce lobjet maPolice de type QFont.

Numrisation Interactive de Partitions

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Si on examine plus en dtail 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 diffrents paramtres de chaque constructeur, il suffit de cliquer sur les flches. On peut changer la taille, mettre en italique Permet de changer le curseur quand on se positionne sur lobjet bouton . Cela permet dafficher 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 rpertoire o se trouve notre fichier .vcxproj !! Voici le rsultat :

On peut samuser en allant sur le site : http://doc.trolltech.com/4.7/classes.html . Maintenant, entrons dans le vif du sujet. Ce que lon a fait jusqu prsent ctait de crer un bouton et Qt a cr une fentre autour de ce bouton. Voici une application (+ explications) pour crer une fentre 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); // Cration d'un widget qui servira de fentre QWidget fenetre; // On dimensionne la fentre fenetre.setFixedSize(300, 150); // On cre un bouton qui a comme parent la fentre QPushButton bouton("ISIB !",&fenetre); bouton.setCursor(Qt::PointingHandCursor); bouton.setIcon(QIcon("smile.png")); // On dplace le bouton de x = 50 y = 60 bouton.move(50,60); // On affiche la fentre fenetre.show(); bouton.setToolTip("De l'aide"); QObject::connect(&bouton, SIGNAL(clicked()), &app, SLOT(quit())); return app.exec();

}
Voici le rsultat :

Numrisation Interactive de Partitions

Version 1.2 du document

Warren PAULUS Robin GODEFROID

Voici dautres 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 paramtre &bouton alors lobjet bouton de tout lheure sera parent de lobjet autreBouton ; on peut remettre &fenetre si on veut.

Petite parenthse, tout lheure, nous avions cr des objets de type QFont mais nous avons oubli de rajouter les includes !

#include #include #include #include #include

<QtGui/qapplication> <QtGui/qpushbutton> <QtGui/qwidget> <QtGui/qfont> <QtGui/qicon>

Notre application fonctionnait car en fait, on avait inclus QPushButton. Et comme QPushButton hrite de QWidget, il avait lui-mme inclus QWidget dans son header. Quant QFont et QIcon, ils taient inclus eux aussi car indirectement utiliss par QPushButton.

Code modulaire :
On peut crer un nouveau projet Makefile (comme expliqu auparavant) ou diter le projet actuel. En ce qui nous concerne, nous avons cr un nouveau projet ModulaireISIB . Crons 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 na rien dtrange, part une ligne !

Numrisation Interactive de Partitions

10

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Ligne de programmation #include "MaFenetre.h" MaFenetre fenetre ; Explication On va inclure un fichier .h On va crer un nouvel objet de la classe MaFenetre

Il va falloir crer une nouvelle classe, ce qui veut dire crer un fichier : MaFenetre.h (dans Fichiers den tte ); MaFenetre.cpp (dans Fichiers sources ). Ds 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 hrite de QWidget (IMPORTANT) { public: MaFenetre(); private: QPushButton *m_bouton; }; #endif
Explication : Ligne de programmation : public QWidget Explication Cette partie permet de dire quon hrite de QWidget donc que notre classe MaFenetre hrite de QWidget. Ici on cre le constructeur de notre classe MaFenetre. Ici on cre un pointeur nomm *m_bouton qui va devoir pointer sur un objet de type QPushButton . Cet objet va tre cr dynamiquement par la suite grce la fonction new !

public: MaFenetre(); Private: QPushButton *m_bouton;

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 :

Numrisation Interactive de Partitions

11

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Ligne de programmation #include "MaFenetre.h" MaFenetre::MaFenetre() : QWidget() Explication Inclure les dfinitions 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 fentre. Cest ici quon va crer notre objet m_bouton avec la fonction new. Ne jamais oublier le this car le parent du bouton est la fentre ! Et nous sommes dans la fentre !

setFixedSize(300, 150); m_bouton = new QPushButton("ISIB !", this);

Voici le rsultat :

Il y a encore dautres fonctions pour les fentres et les boutons, par exemple : Ligne de programmation setWindowFlags(Qt::Tool); Explication

Comme on peut le constater, la fentre na plus la possibilit dtre agrandie ou dtre rduite. fenetre.setWindowIcon(QIcon("image.png"));

Permet dajouter un icone la fentre, cela ne fonctionne pas en mode Qt ::Tool. fenetre.setWindowOpacity(0.8);

Permet de rendre la fentre opaque. fenetre.setWindowTitle("Isib V 0.1");

m_bouton->setCheckable(true);

Permet de changer le titre de la fentre. Permet, quand on clique sur le bouton : quil soit actionn et quand on reclique dessus : quil soit relch.

QCheckBox *checkbox = new QCheckBox("J'aime l'cole", this);

Numrisation Interactive de Partitions

12

Version 1.2 du document

Warren PAULUS Robin GODEFROID


//Radiobouton QGroupBox *groupbox = new QGroupBox("Votre biere prfr", 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); 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 On va crer un groupbox qui va contenir nos RadioButton, ceux-ci sont positionns avec laide dun QVBoxLayout.

Signaux et slots :
Ceci permet de grer les vnements au sein dune fentre, donc : un signal est envoy par un Widget lorsquun vnement se produit; un slot est la fonction qui se produit en cas de signal (cest donc une mthode de la classe).

En fait, Qt rajoute ces lments nos objets Signaux et Slots . On peut aussi connecter des signaux et des slots entre eux (on peut, par exemple, connecter deux objets diffrents). Un signal peut aussi appeler plusieurs slots (mais lordre dexcution nest pas contrl), comme un signal peut provoquer la cration dun autre signal ! Connexion dun signal un slot : Nous allons laborer un programme qui lorsquon on va cliquer sur un bouton, cela fermera la fentre. Nous avons dj 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 cre automatiquement un pointeur vers un objet de type QApplication que nous avons cr dans le main . Utiliser SLOT pour afficher la fentre A propos de Qt . QObject::connect(m_bouton, SIGNAL(clicked()), qApp, SLOT(aboutQt()));

Numrisation Interactive de Partitions

13

Version 1.2 du document

Warren PAULUS Robin GODEFROID

Pour information : On a cr un bouton avec la fonction new , par consquent on est sens dtruire celui-ci, mais en fait Qt sen charge pour nous. Quand on supprime un Widget parent, Qt supprime tous les Widgets lintrieur (enfants). Voyons comment passer des paramtres entre un signal et un slot. Crons un nouveau projet. Le main.cpp reste le mme tandis que MaFenetre.h :

#ifndef DEF_MAFENETRE #define DEF_MAFENETRE #include #include #include #include #include <QtGui/qapplication> <QtGui/qwidget> <QtGui/qpushbutton> <QtGui/qlcdnumber> <QtGui/qslider>

class MaFenetre : public QWidget { public: MaFenetre(); private: QLCDNumber *m_lcd; QSlider *m_slider; }; #endif

Numrisation Interactive de Partitions

14

Version 1.2 du document

Warren PAULUS Robin GODEFROID


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 : http://doc.trolltech.com/4.7/qlcdnumber.html http://doc.trolltech.com/4.7/qslider.html Voil ce que a donne :

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 samuser cest de consulter la documentation relative Qt. Cration de notre propre slot : Le seul moyen de crer des slots et signaux cest que notre classe hrite de QObject : cest le cas pour nous car MaFenetre hrite de QWidget qui lui hrite de QObject. Reprenons, par exemple, le QSlider et faisons un slider qui permettra de modifier la largeur de votre fentre ! Pour cela, crons un nouveau projet.

Numrisation Interactive de Partitions

15

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Le main reste le mme 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))); }

Cration de notre propre signal : Crons une application qui permettra de fermer la fentre quand on arrive la valeur maximum du Slider.

Numrisation Interactive de Partitions

16

Version 1.2 du document

Warren PAULUS Robin GODEFROID


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 :
Crons des botes de dialogue : elles permettront dinteragir avec lutilisateur.

Numrisation Interactive de Partitions

17

Version 1.2 du document

Warren PAULUS Robin GODEFROID


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 #include #include #include <QtGui/qapplication.h> <QtGui/qwidget> <QtGui/qmessagebox> <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 bote 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 !"); }

Numrisation Interactive de Partitions

18

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Voici le rsultat :

Il existe diffrents 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 ! Tratre !\nMenteur !"); } }

Yes

->

No

->

On peut aussi saisir un texte, on peut : reprendre lancien 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

Numrisation Interactive de Partitions

19

Version 1.2 du document

Warren PAULUS Robin GODEFROID


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

Rcupration dun nombre entier : Par dfaut le pas dincrmentation est de 1, si on veut changer il suffit de modifier le step dans les paramtres (*). double nombreDecimal = QInputDialog::getDouble(this, "Nombre", "Entrez un nombre dcimal");

Rcupration dun nombre dcimal : Idem pour les nombres entiers. *

QStringList pays; pays << "France" << "Belgique" << "Suisse" << "Canada (qubec)" << "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 : Aprs avec la police MS PMincho :

Numrisation Interactive de Partitions

20

Version 1.2 du document

Warren PAULUS Robin GODEFROID


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 : Aprs 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 slectionn :\n" + fichier); QString fichier = QFileDialog::getSaveFileName(this, "Enregistrer un fichier", QString(), "Images (*.png *.gif *.jpg *.jpeg)"); Permet de slectionner un dossier sur le disque dur. Permet de slectionner un fichier et de faire apparatre 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(); }

Numrisation Interactive de Partitions

21

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Voici le rsultat :

Explication : Ligne de programmation QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(bouton1); layout->addWidget(bouton2); layout->addWidget(bouton3); fenetre.setLayout(layout); Explication On va donc crer notre layout en appelant le constructeur de la classe QHBoxLayout. On va rajouter nos Widget lintrieur de notre layout. La fonction setLayout attend un pointeur vers le layout utiliser.

Ce qui est intressant, cest que lorsquon change les dimensions de la fentre, le layout sadapte.

Qt efface lui-mme les Widgets et le layout. Layout Vertical : Il faut juste remplacer le QH par QV et modifier linclude, voici ce que a donne :

Layout Grille (rajouter linclude QGridLayout):

QGridLayout *layout = new QGridLayout; layout->addWidget(bouton1, 0, 0); layout->addWidget(bouton2, 0, 1); layout->addWidget(bouton3, 1, 0);
Voil le rsultat :

Layout Formulaire :

#include <QtGui/QFormLayout> #include <QtGui/QLineEdit>

QLineEdit *nom = new QLineEdit; QLineEdit *prenom = new QLineEdit; QLineEdit *age = new QLineEdit; QFormLayout *layout = layout->addRow("Votre layout->addRow("Votre layout->addRow("Votre new QFormLayout; nom", nom); prnom", prenom); ge", age);

Numrisation Interactive de Partitions 22 Version 1.2 du document

Warren PAULUS Robin GODEFROID


Voici le rsultat :

Pour crer des raccourcis clavier il suffit de modifier en ajoutant ceci :

layout->addRow("Votre &nom", nom); layout->addRow("Votre &prnom", prenom); layout->addRow("Votre &ge", age);


Utilisons les touches ALT + N pour arriver au champ nom. On peut constater que la lettre est souligne :

Ajouter un layout dans un autre layout

#include #include #include #include

<QtGui/QApplication> <QtGui/QPushButton> <QtGui/QFormLayout> <QtGui/QLineEdit>

int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget fenetre; // Cration du layout de formulaire et de ses widgets QLineEdit *nom = new QLineEdit; QLineEdit *prenom = new QLineEdit; QLineEdit *age = new QLineEdit; QFormLayout *formLayout = formLayout->addRow("Votre formLayout->addRow("Votre formLayout->addRow("Votre new QFormLayout; &nom", nom); &prnom", prenom); &ge", age);

// Cration du layout principal de la fentre (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

Numrisation Interactive de Partitions

23

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Voici le rsultat :

Petit plus :

//Crypter la donne nom->setEchoMode(QLineEdit::Password); //Text multilignes QTextEdit *ISIB = new QTextEdit(&fenetre); ISIB->setText("isib\nISIB");
Pour plus de facilit, on peut utiliser Qt Designer pour laborer notre interface graphique !

QDebug :
Il est possible de debugger notre programme grce QDebug. Nous allons le raliser dans un projet MakeFile . Pour cela, il va falloir rajouter ceci dans votre .pro : CONFIG += console debug Ce qui nous permettra dactiver la console dans notre projet ! Ensuite, lanons notre projet et rajoutons cet include :

#include <QtCore\qdebug.h>
Maintenant, testons avec cette ligne de code :

qDebug() << "ISIB";


Voici le rsultat obtenu :

Une fentre ralise avec QT et la console apparat aussi !

QThread :
Montrons comment implanter QThread dans un de nos projet. Nous lavons utilis afin de crer un thread qui va permettre de grer la webcam ! Tout dabord, il faut ajouter cet include :

#include <QtCore\qthread.h>
Ensuite, il va falloir crer une classe qui hrite de Qthread comme ceci :

class webcam : public QThread {

};

Numrisation Interactive de Partitions

24

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Il va falloir ensuite redfinir la mthode run :

protected : void run(void) {

}
Et ne pas oublier le constructeur de notre classe.

public : webcam(){

Maintenant, il vous suffit de complter tout cela ! On ne doit oublier de rajouter dans votre main ou autre :

#include "webcam.h" webcam thread;


Ou bien :

webcam *thread; thread = new webcam();

QSplashScreen :
Le Splash Screen est une fentre dattente qui va se lancer au dmarrage de notre application, cela fera un peu plus professionnel. Cette fentre peut aussi tre un endroit o lon met un login et mot de passe. Voici comment le raliser dans le main de notre programme :

QPixmap pix("isib.jpg"); QSplashScreen splash(pix); splash.show(); splash.showMessage("Chargement du processus..."); app.processEvents(); splash.showMessage("Chargement des modules..."); Sleep(10000); //afin de bien voir le splash mais il nest pas indiqu de mettre un sleep dans le main splash.showMessage("Ready");

Avec #include <QtGui\qsplashscreen.h>

Voici le rsultat au dmarrage de votre application :

Numrisation Interactive de Partitions

25

Version 1.2 du document

Warren PAULUS Robin GODEFROID

QFtp :
Nous allons implmenter QFtp dans un projet MakeFile , pour cela il va falloir rajouter une ligne dans votre fichier .pro : QT += network Ds que cela a t fait, on peut rajouter cette ligne votre programme : cela nous permettra d utiliser QFtp :

#include <QtNetwork\qftp.h>
Voici les commandes de base afin de dvelopper une application qui permettra lenvoi dun fichier vers un serveur FTP ou la rception dun fichier venant dun serveur FTP.

//Cration dynamique d'un objet ftp = new QFtp(); //Allocation d'une adresse FTP sur le port 21 ftp->connectToHost(*adresse,port); //Affectation d'un login et mot de passe ftp->login(*log,*pass);
*adresse, *log, *pass sont des QString. port peut tre un int. Tlchargement dun fichier :

QFile *fichier = new QFile(*nomfichier); ftp->cd(*dir); fichier->open(QIODevice::WriteOnly); ftp->setTransferMode(QFtp::Passive); ftp->get(*nomfichier,fichier,QFtp::Binary); connect(ftp, SIGNAL(commandFinished(int, bool)),this,SLOT(ftpCommandFinished(int, bool))); ftp->close();
Explication : Ligne de programmation QFile *fichier = new QFile(*nomfichier); ftp->cd(*dir); fichier->open(QIODevice::WriteOnly); ftp->setTransferMode(QFtp::Passive); ftp->get(*nomfichier,fichier,QFtp::Binary); Explication Cration dun objet QFile avec comme paramtre le nom de votre fichier. Affectation du rpertoire o se trouve notre fichier tlcharger. Modification des paramtres du fichier QFile afin de pouvoir crire dedans. Modification des paramtres de transfert en mode Passive. Nous allons donner comme paramtre le nom du fichier source, nous allons rcuprer les donnes de ce fichier en mode binaire sans pertes dinformations et crire dans le fichier QFile. Pour information, il existe aussi Qftp :: Ascii celui-ci est utilis pour les fichiers texte. Il va falloir mettre un couteur sur le ftp afin de savoir si le tlchargement est termin,

connect(ftp, SIGNAL(commandFinished(int, bool)),this,SLOT(ftpCommandFinished(int, bool)));

Numrisation Interactive de Partitions

26

Version 1.2 du document

Warren PAULUS Robin GODEFROID


etc... Pour information, QFtp fonctionne de manire asynchrone donc on lance une commande mais celleci ne seffectuera pas tout de suite : do lutilit de mettre en uvre la mthode connect ! On va se dconnecter du ftp.

ftp->close();

La diffrence entre le mode actif et le passif concerne la faon dont le second canal est cr : en FTP actif, c'est le serveur qui va crer la connexion en allant se connecter sur un port ouvert du ct du client. en FTP passif, c'est le client qui initie la connexion pour les donnes en allant se connecter sur un port ouvert du ct du serveur. Envoie dun fichier :

fichier = new QFile(*nomfichier); ftp->cd(*dir); fichier->open(QIODevice::ReadOnly); ftp->setTransferMode(QFtp::Passive); ftp->put(fichier,*nomfichier,QFtp::Binary); connect(ftp, SIGNAL(commandFinished(int, bool)),this,SLOT(ftpCommandFinished(int, bool))); ftp->close();
Explication : Ligne de programmation

ftp>put(fichier,*nomfichier,QFtp::Binary);

Explication Nous allons donner comme paramtre le fichier QFile o seront crites toutes les donnes concernant le fichier source (nomfichier), de manire binaire sans pertes dinformations.

Voici le code du slot ftpCommandFinished :

void ftpCommandFinished(int, bool error){ if (ftp->currentCommand() == QFtp::ConnectToHost) { if (error) { qDebug() << "Impossible de se connecter au FTP"; return; } qDebug() << "Acces authorise au FTP"; return; } if (ftp->currentCommand() == QFtp::Login) { if (error) { qDebug() << "Identification refuse"; } }

Numrisation Interactive de Partitions

27

Version 1.2 du document

Warren PAULUS Robin GODEFROID


if (ftp->currentCommand() == QFtp::Cd) { if (error) { qDebug() << "Navigation dans le repertoire impossible"; } else { qDebug() << "Acces authorise vers le repertoire..."; } } if (ftp->currentCommand() == QFtp::Get) { if (error) { qDebug() << "Transfert annule du fichier " << *nomfichier; fichier->close(); fichier->remove(); } else { qDebug() << "Transfert termine du fichier " << *nomfichier; fichier->close(); } delete fichier; fichier = NULL; } if (ftp->currentCommand() == QFtp::Put) { if (error) { qDebug() << "Transfert annule du fichier " << *nomfichier; fichier->close(); fichier->remove(); } else { qDebug() << "Transfert termine du fichier " << *nomfichier; fichier->close(); } delete fichier; fichier = NULL; }

Rsultat :

Il suffit maintenant dajouter les bouts de codes manquants !

Numrisation Interactive de Partitions

28

Version 1.2 du document

Warren PAULUS Robin GODEFROID

3) Qt Designer
Ce logiciel dvelopp par Qt , permet de crer simplement des fentres sans tre oblig de tout coder la main ! Lancement du logiciel : on arrive cette fentre :

Nous allons travailler avec une Main Window , par exemple. Une fentre va tre cre. Constatons qu notre gauche, nous avons la Widget Box et notre droite, tout ce qui concerne notre fentre (Proprits). Il est possible dtablir un Menu pour notre fentre, comme ceci :

Pour visualiser notre fentre, nous devons aller ici :

On peut samuser avec le logiciel, ce nest pas compliqu. Afin de pouvoir rcuprer le code de notre fentre, allons dans View Code (voir image ci-dessus), copier et coller ce code dans notre MaFenetre.cpp .

4) MakeFile
Ralisons un projet MakeFile avec les librairies suivantes : Qt ; OpenCV ; VideoInput ; LibHaru ; FmodEx. Il suffit de crer un projet MakeFile , et de ne surtout pas oublier dcrire, dans la partie build , qmake & nmake et aussi denlever le qmake project sinon le programme va nous recrer un fichier .pro chaque fois que nous lancerons notre application !

Numrisation Interactive de Partitions

29

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Lors du premier lancement de notre application, on verra apparaitre des fichiers MakeFile et un fichier .pro . Ouvrons le fichier .pro avec le bloc note par exemple. Voici un exemple de fichier .pro de base :

TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . # Input HEADERS += MaFenetre.h SOURCES += MaFenetre.cpp main.cpp
FIN DU TUTORIAL

Rajoutons pas pas chacune des librairies.

FmodEx :
Voir le tutoriel sur linstallation de FmodEx . Cette bibliothque peut tre rajoute soit dans le dossier de notre projet MakeFile ou bien en dehors. FmodEx dans notre dossier projet : Allons dans le rpertoire dinstallation de FmodEx : C:\Program Files (x86)\FMOD SoundSystem\FMOD Programmers API Win32\api Dans ce rpertoire, ce qui nous intresse, ce sont les dossiers lib et inc ainsi que le fichier dll fmodex.dll . On peut copier ces dossiers et le fichier ci-dessus dans notre projet (o se trouve notre fichier .vcxproj). Quand cest fait, on peut modifier le fichier .pro comme suit :

Numrisation Interactive de Partitions

30

Version 1.2 du document

Warren PAULUS Robin GODEFROID

TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . LIBS += -L"lib" -lfmodex_vc # Input HEADERS += inc/fmod.h \ inc/fmod.hpp \ inc/fmod_codec.h \ inc/fmod_dsp.h \ inc/fmod_errors.h \ inc/fmod_memoryinfo.h \ inc/fmod_output.h \ MaFenetre.h SOURCES += MaFenetre.cpp main.cpp

Explication : Dans LIBS, rajoutons les librairies de FmodEx . Le -L va permettre de dfinir un rpertoire o se trouve notre fichier .lib . Ensuite, rajoutons le fichier .lib avec la commande -l suivie du nom de notre libraire. Donc, on a fmodex_vc.lib dans le dossier lib ce qui va donner -L"lib" -lfmodex_vc . Rajoutons les fichiers .h , dans la partie HEADERS , ces fichiers se trouvent dans le rpertoire inc que nous avons copi auparavant. Maintenant, on peut lancer notre programme ! Pour rajouter nos .h , il suffit dcrire, par exemple :

#include "inc\fmod.hpp" #include "inc\fmod_errors.h"

Numrisation Interactive de Partitions

31

Version 1.2 du document

Warren PAULUS Robin GODEFROID


FmodEx en dehors de notre dossier projet : Ouvrons le fichier .pro . On peut le modifier comme ceci :

TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . LIBS += -L""C:/Program Files (x86)/FMOD SoundSystem/FMOD Programmers API Win32/api/lib" -lfmodex_vc # Input HEADERS += "C:/Program Files (x86)/FMOD SoundSystem/FMOD Programmers API Win32/api/inc/fmod.h" \ "C:/Program Files (x86)/FMOD SoundSystem/FMOD Programmers API Win32/api/inc/fmod.hpp" \ "C:/Program Files (x86)/FMOD SoundSystem/FMOD Programmers API Win32/api/inc/fmod_codec.h" \ "C:/Program Files (x86)/FMOD SoundSystem/FMOD Programmers API Win32/api/inc/fmod_dsp.h" \ "C:/Program Files (x86)/FMOD SoundSystem/FMOD Programmers API Win32/api/inc/fmod_errors.h" \ "C:/Program Files (x86)/FMOD SoundSystem/FMOD Programmers API Win32/api/inc/fmod_memoryinfo.h" \ "C:/Program Files (x86)/FMOD SoundSystem/FMOD Programmers API Win32/api/inc/fmod_output.h" \ MaFenetre.h SOURCES += MaFenetre.cpp main.cpp
Comme on peut le constater, il faut dfinir le lien vers le rpertoire dinstallation de la bibliothque. Voici un programme que nous avons ralis :

Numrisation Interactive de Partitions

32

Version 1.2 du document

Warren PAULUS Robin GODEFROID


OpenCv :
Repartons de notre fichier .pro avec FmodEx. Voici ce quil faut rajouter pour utiliser OpenCV :

TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . CONFIG+= . LIBS += -L"lib" -lfmodex_vc -L"C:/OpenCV2.2/lib" -lopencv_core220d -lopencv_highgui220d lopencv_video220d -lopencv_ml220d -lopencv_legacy220d -lopencv_imgproc220d # Input HEADERS += "C:/OpenCV2.2/include/opencv/cv.h" \ "C:/OpenCV2.2/include/opencv/highgui.h" \ inc/fmod.h \ inc/fmod.hpp \ inc/fmod_codec.h \ inc/fmod_dsp.h \ inc/fmod_errors.h \ inc/fmod_memoryinfo.h \ inc/fmod_output.h \ MaFenetre.h SOURCES += MaFenetre.cpp main.cpp

Nous avons donc rajout les librairies dOpenCV, et les fichiers .h , comme avec FmodEx. Puis ensuite, dans Visual Studio, on doit faire un clic droit sur notre projet, ensuite Proprit , puis Rpertoire VC++ . Voici ce quil faut rajouter (voir tutoriel OpenCV pour plus dinformation) :

Normalement, on peut crire :

#include <opencv\cv.h> #include <opencv\highgui.h>

Numrisation Interactive de Partitions

33

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Voici notre programme :

Pour information, nous avons d convertir lIplImage dopenCV en QImage et ensuite lafficher dans un label.

LibHaru :
A tlcharger ici : http://libharu.org/files/libharu_2_0_8_dll_win32.zip A dzipper dans le rpertoire de notre choix. Nous allons donc rcuprer ce quil y a dans le dossier include et tout placer dans le dossier inc de FmodEx ou dans un nouveau dossier. Il faudra prendre aussi le fichier lib libhpdf.lib que nous pouvons placer dans le dossier lib de notre projet et le fichier dll libhpdf.dll mettre dans la racine de notre projet o se trouve notre fichier .vcxproj . Il suffit maintenant dcrire, dans notre projet par exemple MaFenetre.h :

#include "inc\hpdf.h"
Et maintenant on peut utiliser LibHaru ! Voici un exemple de code avec Qt dans le fichier MaFenetre.cpp :

const char* fname="Result.pdf"; pdf = HPDF_New(NULL, NULL); if (!pdf) { QMessageBox::warning(this, "Erreur", "Le pdf n'a pas t cr !"); } //HPDF_SetCompressionMode (pdf, HPDF_COMP_ALL); HPDF_SetCompressionMode(pdf,HPDF_COMP_NONE); /* add a new page object. */ page = HPDF_AddPage (pdf); /* load image file. */ image= HPDF_LoadJpegImageFromFile (pdf, "isib.jpg"); iw = (HPDF_REAL)HPDF_Image_GetWidth(image); ih = (HPDF_REAL)HPDF_Image_GetHeight (image); HPDF_Page_SetWidth (page, iw); HPDF_Page_SetHeight (page, ih); HPDF_Page_DrawImage (page, image, x, y, iw, ih); //HPDF_Page_GSave (page); HPDF_SaveToFile (pdf, fname); /* clean up */ HPDF_Free (pdf); }

Numrisation Interactive de Partitions

34

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Il faudra rajouter dans notre fichier MaFenetre.h par exemple :

HPDF_Doc pdf; HPDF_Page page; HPDF_Image image; HPDF_REAL iw,ih,x,y;

VideoInput:
Cette bibliothque se trouve sur http://muonics.net/school/spring05/videoInput/ . On peut placer le fichier videoInput.lib dans le rpertoire lib de notre projet ainsi que le fichier videoInput.h dans le rpertoire include ou inc . Nous allons donc modifier le fichier .pro :

TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . CONFIG += . LIBS += -nodefaultlib:atlthunk.lib -nodefaultlib:LIBC.lib -L"lib" -lfmodex_vc -lvideoInput -llibhpdf L"C:/OpenCV2.2/lib" -lopencv_core220d -lopencv_highgui220d -lopencv_video220d -lopencv_ml220d lopencv_legacy220d -lopencv_imgproc220d # Input HEADERS += "C:/OpenCV2.2/include/opencv/cv.h" \ "C:/OpenCV2.2/include/opencv/highgui.h" \ inc/videoInput.h \ inc/hpdf.h \ inc/hpdf_consts.h \ inc/hpdf_types.h \ inc/fmod.h \ inc/fmod.hpp \ inc/fmod_codec.h \ inc/fmod_dsp.h \ inc/fmod_errors.h \ inc/fmod_memoryinfo.h \ inc/fmod_output.h \ MaFenetre.h SOURCES += MaFenetre.cpp main.cpp
FIN DU TUTORIAL

Numrisation Interactive de Partitions

35

Version 1.2 du document

Warren PAULUS Robin GODEFROID


Comme on peut le constater, nous avons rajout la ligne :

-nodefaultlib:atlthunk.lib -nodefaultlib:LIBC.lib -L"lib" -lvideoInput >> dans LIBS. inc/videoInput.h \ >> dans HEADER.
Pour information, le nodefaultlib permet le bon fonctionnement de videoInput car il faut dsactiver des .lib par dfaut ! Pour lutilisation de VideoInput dans un projet, il suffit de rajouter cette ligne :

#include "inc\videoInput.h"
Voici un bout de programme qui fonctionne sous Qt, mettre dans votre .cpp :

#define device 0 vi = new videoInput(); vi->setupDevice(device,1280,960); // select device and resolution // if all is OK with device if(vi->isDeviceSetup(device)) { cvNamedWindow("Webcam play", CV_WINDOW_AUTOSIZE); imageweb = cvCreateImage(cvSize(vi->getWidth(device),vi->getHeight(device)),8, 3); while(true) { // if we have a new frame on the camera buffer if(vi->isFrameNew(device)) { // get the pixels from the image to the imageData of the OpenCV // BGR order, flipped (=> do not requrie flipping or origin fixes) vi->getPixels(0,(unsigned char*)imageweb->imageData,false,true); // display the image in an OpenCV window cvShowImage("Webcam play",imageweb); cvWaitKey(1); } } }
Et ce qui suit, dans votre .h par exemple :

videoInput *vi; IplImage* imageweb;


FIN DU TUTORIAL

Numrisation Interactive de Partitions

36

Version 1.2 du document