2010/2011
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 .
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
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.
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...
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 .
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 :
Cliquer sur Appliquer , puis sur OK . Faire un clic droit sur Fichiers sources , ensuite Ajouter , puis Nouvelle lment...
#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(); }
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.
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 .
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.
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 :
Voici dautres fonctions : Ligne de programmation bouton.setGeometry(50, 60, 100, 50); Explication On peut changer la localisation du bouton ainsi que sa taille.
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 !
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(); }
10
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 !
#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 :
11
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);
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.
12
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()));
13
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
14
#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.
15
#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.
16
#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.
17
#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 !"); }
18
Il existe diffrents types de QMessageBox , voici quelques exemples : Ligne de programmation QMessageBox::warning(this, "Le titre pour l'ISIB", "ISIB !"); Explication
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
19
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");
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 :
20
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.
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(); }
21
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 :
QGridLayout *layout = new QGridLayout; layout->addWidget(bouton1, 0, 0); layout->addWidget(bouton2, 0, 1); layout->addWidget(bouton3, 1, 0);
Voil le rsultat :
Layout Formulaire :
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);
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
23
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 :
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 :
};
24
}
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 :
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");
25
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,
26
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.
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"; } }
27
Rsultat :
28
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 :
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 !
29
TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . # Input HEADERS += MaFenetre.h SOURCES += MaFenetre.cpp main.cpp
FIN DU TUTORIAL
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 :
30
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 :
31
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 :
32
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) :
33
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); }
34
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
35
-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 :
36