« Programmation Qt/Un premier programme » : différence entre les versions
Automatique : Mise à jour de la navigation entre les chapitres |
m Formatage, ajout de code |
||
Ligne 30 : | Ligne 30 : | ||
# Ouvrez une fenêtre de commande et assurez vous d'avoir le répertoire du compilateur C++ et celui de Qt dans le PATH : |
# Ouvrez une fenêtre de commande et assurez vous d'avoir le répertoire du compilateur C++ et celui de Qt dans le PATH : |
||
#* Si vous avez installé la version binaire de QtSDK, lancez la console pour Qt : |
#* Si vous avez installé la version binaire de QtSDK, lancez la console pour Qt : |
||
#** Sous Windows : < |
#** Sous Windows : <code>Démarrer > Tous les programmes > Qt DSK > Desktop > Qt ''version'' for Desktop (''compilateur'')</code> |
||
#* Sinon, configurez la variable d'environnement PATH puis lancer une console de commandes. |
#* Sinon, configurez la variable d'environnement PATH puis lancer une console de commandes. |
||
# Créez le fichier projet Qt < |
# Créez le fichier projet Qt <code>HelloWorld.pro</code> : |
||
qmake -project |
qmake -project |
||
#<li value="4">Créez le fichier < |
#<li value="4">Créez le fichier <code>Makefile</code> à partir du fichier projet :</li> |
||
qmake |
qmake |
||
#<li value="5">Construisez le programme en utilisant le compilateur C++ (GCC, Visual C++, MinGW, ...) :</li> |
#<li value="5">Construisez le programme en utilisant le compilateur C++ (GCC, Visual C++, MinGW, ...) :</li> |
||
Ligne 44 : | Ligne 44 : | ||
mingw32-make |
mingw32-make |
||
Si aucune erreur ne se produit, deux sous-répertoires < |
Si aucune erreur ne se produit, deux sous-répertoires <code>debug</code> et <code>release</code> ont été créés, et le fichier exécutable a été créé dans l'un d'eux : |
||
* < |
* <code>HelloWorld.exe</code> sous Windows |
||
* < |
* <code>HelloWorld</code> ou <code>a.out</code> sous Unix, Linux |
||
Dans le cas contraire : |
Dans le cas contraire : |
||
* vérifiez que vous avez bien tapé le code source ci-dessus, |
* vérifiez que vous avez bien tapé le code source ci-dessus, |
||
Ligne 96 : | Ligne 96 : | ||
Les options reconnues et traitées sont retirées du tableau au retour du constructeur pour que l'application ne les traitent pas à son tour. |
Les options reconnues et traitées sont retirées du tableau au retour du constructeur pour que l'application ne les traitent pas à son tour. |
||
Parmi les options traitées : |
Parmi les options traitées : |
||
;Nom du programme < |
;Nom du programme <code>argv[0]</code>:Le nom du programme (sans extension .exe sous Windows) est utilisé comme nom par défaut pour l'application et comme titre par défaut pour les fenêtres. |
||
;< |
;<code>-display</code>:(X11 seulement) Sélectionne le display ($DISPLAY par défaut) |
||
;< |
;<code>-style ''style''</code>:Sélectionne le style utilisé par les éléments de l'interface. |
||
Pour plus de détails sur les options traitées, voir https://qt-project.org/doc/qt-4.7/qapplication.html |
Pour plus de détails sur les options traitées, voir https://qt-project.org/doc/qt-4.7/qapplication.html |
||
Ligne 124 : | Ligne 124 : | ||
</source> |
</source> |
||
Lancement l'exécution de la boucle traitant des évènements. |
Lancement l'exécution de la boucle traitant des évènements. |
||
La méthode < |
La méthode <code>exec()</code> retourne le code de retour du programme. |
||
==== Fin ==== |
==== Fin ==== |
||
Ligne 138 : | Ligne 138 : | ||
Cette fois-ci le fichier projet sera créé manuellement. |
Cette fois-ci le fichier projet sera créé manuellement. |
||
Celui-ci définit le modèle de programme à produire (< |
Celui-ci définit le modèle de programme à produire (<code>app</code> pour une application), et la liste des fichiers sources et en-têtes. |
||
{{FichierDébut|essais.pro|info=Description du projet Qt}} |
{{FichierDébut|essais.pro|info=Description du projet Qt}} |
||
Ligne 151 : | Ligne 151 : | ||
Un fichier projet possède une syntaxe similaire à celle des fichiers Makefile. |
Un fichier projet possède une syntaxe similaire à celle des fichiers Makefile. |
||
Différentes variables sont définies (=) ou complétées (+=) : |
Différentes variables sont définies (=) ou complétées (+=) : |
||
* '''< |
* '''<code>TEMPLATE</code>''' : Modèle d'exécutable à générer (<code>app</code> pour une application autonome, <code>lib</code> pour une bibliothèque ou un plug-in). |
||
* '''< |
* '''<code>SOURCES</code>''' : Listes des fichiers sources (*.cpp) du projet. |
||
* '''< |
* '''<code>HEADERS</code>''' : Listes des fichiers d'en-tête (*.h) du projet. |
||
* '''< |
* '''<code>FORMS</code>''' : Listes des formulaires [[../Qt Designer/]] (*.ui) du projet. |
||
* '''< |
* '''<code>DEFINES</code>''' : Listes des symboles définis lors de la compilation du projet. |
||
Ligne 174 : | Ligne 174 : | ||
La fenêtre principale est allouée pour l'exemple sur la pile d'appel. |
La fenêtre principale est allouée pour l'exemple sur la pile d'appel. |
||
Cependant, dans le cas où plusieurs instances de cette fenêtre (pour ouvrir plusieurs fichiers par exemple) sont créées et ouvertes, ou fermées (dont probablement la première instance créée), il est préférable d'allouer la première instance sur le tas (utiliser un pointer et allouer avec < |
Cependant, dans le cas où plusieurs instances de cette fenêtre (pour ouvrir plusieurs fichiers par exemple) sont créées et ouvertes, ou fermées (dont probablement la première instance créée), il est préférable d'allouer la première instance sur le tas (utiliser un pointer et allouer avec <code>new</code>) et d'utiliser l'option <code>Qt::WA_DeleteOnClose</code>. |
||
Ligne 215 : | Ligne 215 : | ||
=== Compiler le programme === |
=== Compiler le programme === |
||
La compilation s'effectue de la même façon que pour le programme précédent, excepté que la première commande (< |
La compilation s'effectue de la même façon que pour le programme précédent, excepté que la première commande (<code>qmake -project</code>) n'est plus nécessaire puisque l'on a déjà un fichier projet (essais.pro). |
||
Le nom de ce fichier projet détermine également le nom de l'exécutable (< |
Le nom de ce fichier projet détermine également le nom de l'exécutable (<code>essais.exe</code> sous Windows). |
||
=== Exécution === |
=== Exécution === |
||
Ligne 223 : | Ligne 223 : | ||
** soit dans le même répertoire que l'exécutable, |
** soit dans le même répertoire que l'exécutable, |
||
** soit dans un répertoire du PATH (sous Windows) ou de LD_LIBRARY_PATH (Unix/Linux). |
** soit dans un répertoire du PATH (sous Windows) ou de LD_LIBRARY_PATH (Unix/Linux). |
||
* Si les bibliothèques ont été compilées en mode '''liaison statique''' (< |
* Si les bibliothèques ont été compilées en mode '''liaison statique''' (<code>configure -static</code>), celle-ci sont directement intégrées à l'exécutable produit à la compilation. |
||
Les bibliothèques en question sont en général : |
Les bibliothèques en question sont en général : |
||
* < |
* <code>QtCore4.dll</code> et <code>QtGui4.dll</code> pour Qt (ou avec un d comme suffixe <code>QtCore4d.dll</code> et <code>QtGui4d.dll</code> en mode debug) ; |
||
* < |
* <code>mingwm10.dll</code> pour MinGW. Cependant celle-ci n'est pas toujours requise. |
||
En exécutant le programme, on obtient une fenêtre vide. |
En exécutant le programme, on obtient une fenêtre vide. |
||
Ligne 233 : | Ligne 233 : | ||
=== Analyse === |
=== Analyse === |
||
* Le fichier < |
* Le fichier <code>essais.pro</code> répertorie les différents fichiers du projet. |
||
* On déclare <code>app</code> objet de la classe <code>QApplication</code> et <code>mainWin</code> objet de la classe <code>MainWindow</code>. |
* On déclare <code>app</code> objet de la classe <code>QApplication</code> et <code>mainWin</code> objet de la classe <code>MainWindow</code>. |
||
* <code>MainWindow</code> est une classe dérivée de <code>QWidget</code> à laquelle on ne va pour l'instant rien ajouter. |
* <code>MainWindow</code> est une classe dérivée de <code>QWidget</code> à laquelle on ne va pour l'instant rien ajouter. |
Version du 23 juillet 2017 à 13:25
Ce chapitre propose de créer un premier programme et de le compiler en utilisant des lignes de commandes, afin de se familiariser rapidement aux mécanismes de compilation de Qt.
Afficher un bouton
Ce premier programme crée un bouton et l'affiche dans une fenêtre automatiquement créée par Qt.
Fichier
Compilation
Pour compiler le programme :
- Ouvrez une fenêtre de commande et assurez vous d'avoir le répertoire du compilateur C++ et celui de Qt dans le PATH :
- Si vous avez installé la version binaire de QtSDK, lancez la console pour Qt :
- Sous Windows :
Démarrer > Tous les programmes > Qt DSK > Desktop > Qt version for Desktop (compilateur)
- Sous Windows :
- Sinon, configurez la variable d'environnement PATH puis lancer une console de commandes.
- Si vous avez installé la version binaire de QtSDK, lancez la console pour Qt :
- Créez le fichier projet Qt
HelloWorld.pro
:
qmake -project
- Créez le fichier
Makefile
à partir du fichier projet :
qmake
- Construisez le programme en utilisant le compilateur C++ (GCC, Visual C++, MinGW, ...) :
- Pour GCC :
make
- Pour Visual C++ :
nmake
- Pour MinGW :
mingw32-make
Si aucune erreur ne se produit, deux sous-répertoires debug
et release
ont été créés, et le fichier exécutable a été créé dans l'un d'eux :
HelloWorld.exe
sous WindowsHelloWorld
oua.out
sous Unix, Linux
Dans le cas contraire :
- vérifiez que vous avez bien tapé le code source ci-dessus,
- vérifiez que vous avez bien utilisé les mêmes noms de fichier,
- vérifiez que vous avez bien tapé les commandes de compilation,
- vérifiez l'installation du compilateur C++ et de Qt.
Exécution
Au lancement du programme, une fenêtre s'affiche avec un bouton "Hello world!" au centre de celle-ci.
Code source expliqué
Voici le détail du code source expliqué :
En-têtes
#include <QApplication>
#include <QPushButton>
Inclusion des fichiers d'en-tête définissant les deux classes utilisées dans le programme.
Fonction principale
int main(int argc, char* argv[])
{
//Code
}
Déclaration standard de la fonction principale lançant l'application.
Notez que l'on peut aussi le trouver écrit comme cela, bien que la version précédente soit plus complète :
int main()
{
//Code
}
Application Qt
QApplication app(argc, argv);
Création de l'instance unique de la classe QApplication définissant la configuration par défaut des éléments graphiques.
Les arguments de la ligne de commande sont passés au constructeur pour qu'il interprète certaines options. Les options reconnues et traitées sont retirées du tableau au retour du constructeur pour que l'application ne les traitent pas à son tour. Parmi les options traitées :
- Nom du programme
argv[0]
- Le nom du programme (sans extension .exe sous Windows) est utilisé comme nom par défaut pour l'application et comme titre par défaut pour les fenêtres.
-display
- (X11 seulement) Sélectionne le display ($DISPLAY par défaut)
-style style
- Sélectionne le style utilisé par les éléments de l'interface.
Pour plus de détails sur les options traitées, voir https://qt-project.org/doc/qt-4.7/qapplication.html
Bouton
QPushButton hello("Hello world!");
Création d'un bouton dont le texte "Hello world!" est passé en paramètre du constructeur.
Configuration du bouton
hello.resize(100,30);
Redimensionne le bouton à 100 pixels de largeur et 30 de hauteur.
Afficher
hello.show();
Affiche le bouton dans une fenêtre créée pour le contenir.
Boucle de traitement des évènements
return app.exec();
Lancement l'exécution de la boucle traitant des évènements.
La méthode exec()
retourne le code de retour du programme.
Fin
}
Fin de la fonction principale.
Un second programme
Voici un programme très simple qui permettra l'affichage d'une fenêtre, plus précisément la fenêtre principale.
Cette fois-ci le fichier projet sera créé manuellement.
Celui-ci définit le modèle de programme à produire (app
pour une application), et la liste des fichiers sources et en-têtes.
essais.pro Description du projet Qt | |
---|---|
TEMPLATE = app
SOURCES = main.cpp \
mainwindow.cpp
HEADERS = mainwindow.h
|
Un fichier projet possède une syntaxe similaire à celle des fichiers Makefile.
Différentes variables sont définies (=) ou complétées (+=) :
TEMPLATE
: Modèle d'exécutable à générer (app
pour une application autonome,lib
pour une bibliothèque ou un plug-in).SOURCES
: Listes des fichiers sources (*.cpp) du projet.HEADERS
: Listes des fichiers d'en-tête (*.h) du projet.FORMS
: Listes des formulaires Qt Designer (*.ui) du projet.DEFINES
: Listes des symboles définis lors de la compilation du projet.
La fenêtre principale est allouée pour l'exemple sur la pile d'appel.
Cependant, dans le cas où plusieurs instances de cette fenêtre (pour ouvrir plusieurs fichiers par exemple) sont créées et ouvertes, ou fermées (dont probablement la première instance créée), il est préférable d'allouer la première instance sur le tas (utiliser un pointer et allouer avec new
) et d'utiliser l'option Qt::WA_DeleteOnClose
.
mainwindow.h En-tête pour la classe de la fenêtre principale | |
---|---|
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow();
};
#endif
|
Cette fenêtre dérive de la classe QWidget comme tout objet Qt pour l'interface graphique.
Il s'agit avant tout d'un conteneur de widget plutôt que la fenêtre elle-même.
La macro Q_OBJECT est utilisée avec toute classe Qt pour définir les informations sur la classe.
mainwindow.cpp Implémentation de la classe de la fenêtre principale | |
---|---|
#include <QtGui>
#include "mainwindow.h"
MainWindow::MainWindow()
{
}
|
Compiler le programme
La compilation s'effectue de la même façon que pour le programme précédent, excepté que la première commande (qmake -project
) n'est plus nécessaire puisque l'on a déjà un fichier projet (essais.pro).
Le nom de ce fichier projet détermine également le nom de l'exécutable (essais.exe
sous Windows).
Exécution
Les bibliothèques de Qt sont nécessaires à l'exécution de tout programme Qt :
- Par défaut, celles-ci sont compilées en mode liaison dynamique (.dll sous Windows, .so sous Unix/Linux). Cela signifie que les bibliothèques utilisées par l'application doivent de situer :
- soit dans le même répertoire que l'exécutable,
- soit dans un répertoire du PATH (sous Windows) ou de LD_LIBRARY_PATH (Unix/Linux).
- Si les bibliothèques ont été compilées en mode liaison statique (
configure -static
), celle-ci sont directement intégrées à l'exécutable produit à la compilation.
Les bibliothèques en question sont en général :
QtCore4.dll
etQtGui4.dll
pour Qt (ou avec un d comme suffixeQtCore4d.dll
etQtGui4d.dll
en mode debug) ;mingwm10.dll
pour MinGW. Cependant celle-ci n'est pas toujours requise.
En exécutant le programme, on obtient une fenêtre vide.
Analyse
- Le fichier
essais.pro
répertorie les différents fichiers du projet. - On déclare
app
objet de la classeQApplication
etmainWin
objet de la classeMainWindow
. MainWindow
est une classe dérivée deQWidget
à laquelle on ne va pour l'instant rien ajouter.
Explications
essais.pro Description du projet Qt | |
---|---|
TEMPLATE = app
SOURCES = main.cpp \
mainwindow.cpp
HEADERS = mainwindow.h
|
Dans ce fichier, on met tous les fichiers et les headers utilisés.
#include <QApplication>
On inclue la création de fenêtres.
#include "mainwindow.h"
On inclue notre header. Attention de ne pas oublier les guillemets !
int main ( int argc, char *argv[] )
{
//Code
}
On créé notre fonction principale.
QApplication app(argc, argv);
On créé l'application.
MainWindow mainWin;
mainWin.show();
On appelle une fenêtre de type MainWindow et on l'affiche.
return app.exec();
Execution de l'application.