Qt4 et C++

Un article de OpenIHS.org.

Ce mini tutoriel explique comment Démarrer un petit projet avec une application Qt4 en utilisant entrautre cmake et le designer.

Pour la partie compilation, j'emploie CMake. Pour certain j'aurais peut-être l'impression d'insister, mais non ! D'une part je n'ai pas d'actions chez CMake INC et d'autre part c'est la seule façon que je connaisse, d'autant plus que j'ai vraiment pas envie de me prendre la tête à me trainer des Makefiles persos, des procédures alambiquées, et j'en passe... Ce qui est bien, c'est qu'il s'adapte à toutes les situation, quelque soit le contexte, et tout ça de façon relativement simple...

Voilà pour la petite anecdote... maintenant, revenons à nous moutons :

Sommaire

[modifier] Arborescences du projet

Voilà l'arborescence du projet sur lequel je fais me baser pour l'explication :

Elle est composée de :

  • Un main (fichier main.cpp) servant à lancer la fenêtre principale (classe WinExemple).
  • Une fenêtre (fichier WinExemple.ui) un fichier xml avec la description des objets qui composent celle-ci et dont se servira le générateur de Qt pour générer la classe Ui::WinExemple. Vous remarquerez que cette classe est empackagée dans le namespace Ui pour éviter de faire un conflit avec la classe WinExemple décrite au point suivant.
  • Une classe WinExemple (fichiers WinExemple.h et WinExemple.cpp). Cette classe héritera de la classe Ui::WinExemple et on ce servira de celle-ci pour implémenter les méthodes nécessaires. Vous remarquerez que j'ai mis le même nom pour la fenêtre (Ui::WinExemple) que pour la classe (WinExemple).
  • Un fichier de ressource ico.qrc pour référencer les icônes et images du projet.
  • Un fichier CMake (fichier CMakeLists.txt) pour gérérer le Makefile automatiquement... (Optionnel)


Image:WinExempleArboFiles.png

Image:UiWinExemple.png

[modifier] Fichier WinExemple.ui

Une petite capture d'écran indiquant où il faut mettre le nom de la classe...

Image:WinExempleDesigner.png

[modifier] Classe WinExemple

[modifier] Fichier WinExemple.h

  1. //
  2. // C++ Interface: WinExemple
  3. //
  4. // Description:
  5. //
  6. //
  7. // Author: Emeric Verschuur <contact@openihs.org>, (C) 2008
  8. //
  9. // Copyright: See COPYING file that comes with this distribution
  10. //
  11. //
  12. #ifndef WINEXEMPLE_H
  13. #define WINEXEMPLE_H
  14.  
  15. #include "ui_WinExemple.h"
  16. #include <QMainWindow>
  17.  
  18. class WinExemple : public QMainWindow, public Ui::WinExemple {
  19.     Q_OBJECT
  20. public:
  21.     WinExemple(QWidget *parent = 0, Qt::WFlags fl = 0);
  22.     ~WinExemple();
  23. public slots:
  24.    
  25. private:
  26.    
  27. };
  28.  
  29. #endif

[modifier] Fichier WinExemple.cpp

  1. //
  2. // C++ Implementation: WinExemple
  3. //
  4. // Description:
  5. //
  6. //
  7. // Author: Emeric Verschuur <contact@openihs.org>, (C) 2008
  8. //
  9. // Copyright: See COPYING file that comes with this distribution
  10. //
  11. //
  12. #include "WinExemple.h"
  13.  
  14. WinExemple::WinExemple(QWidget* parent, Qt::WFlags fl)
  15.         :QMainWindow(parent, fl) {
  16.     setupUi(this);
  17.    
  18. }
  19.  
  20. WinExemple::~WinExemple() {
  21.    
  22. }

[modifier] Fichier main.cpp

  1. //
  2. // C++ Implementation: main
  3. //
  4. // Description:
  5. //
  6. //
  7. // Author: Emeric Verschuur <contact@openihs.org>, (C) 2008
  8. //
  9. // Copyright: See COPYING file that comes with this distribution
  10. //
  11. //
  12. #include <QApplication>
  13. #include "WinExemple.h"
  14.  
  15. int main(int argc, char** argv) {
  16.     QApplication app(argc, argv);
  17.     WinExemple win;
  18.     app.setActiveWindow(&win);
  19.     win.show();
  20.     return app.exec();
  21. }

[modifier] Fichier CMakeLists.txt

[modifier] Contenu du fichier

# ### HEAD ###
PROJECT(exemple)

# ### COMMUN ### Partie à modifier
# Liste des sources du projet
SET(project_SRCS WinExemple.cpp main.cpp)
# Liste des fenêtres (fichiers .ui) générées avec le designer
SET(project_UIS ui/WinExemple.ui)
# Liste des interface QT (fichiers .h comportant la macro "Q_OBJECT" au début de la définition de la classe)
SET(project_MOC_HDRS WinExemple.h)
# Liste des bibliothèques (sans le préfix -l)
SET(project_LIBS )
# Liste des définitions (compile flags)
SET(project_DEFS -Wall -g3)
# Liste des options d'édition de lien (link flags)
SET(project_LDFS )

# ### BODY ###
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.0)
FIND_PACKAGE(Qt4 REQUIRED)
INCLUDE(${QT_USE_FILE})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
QT4_ADD_RESOURCES(project_SRCS ui/ico.qrc)
QT4_WRAP_UI(project_UIS_H ${project_UIS})
QT4_WRAP_CPP(project_MOC_SRCS ${project_MOC_HDRS})
SET(project_LIBS ${project_LIBS} ${QT_LIBRARIES})

# ### BUILD ###
ADD_DEFINITIONS(${project_DEFS})
ADD_EXECUTABLE(exemple ${project_UIS_H} ${project_SRCS} ${project_MOC_SRCS} ${project_OBJS} )
SET_TARGET_PROPERTIES(exemple PROPERTIES LINK_FLAGS "${project_LDFS}")
TARGET_LINK_LIBRARIES(exemple ${project_LIBS})

# ### INSTALL ###
INSTALL(TARGETS exemple DESTINATION bin PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE)

[modifier] Utilisation CMake

  • Grâce à CMake, on peu dissocier le dossier source et le dossier de compilation. Voilà comment je procède habituellement :

On suppose qu'on est dans le dossier bin fraîchement créé : on a plus qu'a taper les commandes suivantes :

 $ cd bin
 $ cmake ../src/

Pour certain système d'exploitation la détection de qmake pose problème. Pour remédier à ce problème, il siffit de taper :

 $ cmake ../trunk/ -DQT_QMAKE_EXECUTABLE:STRING="/usr/lib/qt4/bin/qmake"

/usr/lib/qt4/bin/qmake est le chemin sous Mandriva, cependant il est probable que ce soit différent pour d'autres systèmes... Voilà ! ça se limite à ça le CMake donc à part pour l'initialisation on aura plus besoin de taper cette commande car même en cas de modification du fichier CMakeLists.txt dans le trunk, le Makefile dans le dossier bin se mettra à jour automatiquement au prochain coup de make.

  • Pour les IDEs de développement il suffit de créer/importer un projet simple ou à partir de Makefile personnalisé et ensuite de spécifier d'une part le dossier de compilation (bin/) et d'autre part le chemin du Makefile (bin/Makefile).
  • Pour avoir le détail des commandes (g++ avec les 5 lignes de flags etc...) vous pouvez rajouter l'argument : -DCMAKE_VERBOSE_MAKEFILE:BOOLEAN=TRUE à la commande cmake

[modifier] Annexe

[modifier] Sources

http://ftp.openihs.org/divers/tuto/exemple.tar.gz

Compte svn/dav & co
Divers
Administration