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 :
[modifier] Fichier WinExemple.ui
Une petite capture d'écran indiquant où il faut mettre le nom de la classe...
[modifier] Classe WinExemple
[modifier] Fichier WinExemple.h
- //
- // C++ Interface: WinExemple
- //
- // Description:
- //
- //
- // Author: Emeric Verschuur <contact@openihs.org>, (C) 2008
- //
- // Copyright: See COPYING file that comes with this distribution
- //
- //
- #ifndef WINEXEMPLE_H
- #define WINEXEMPLE_H
- #include "ui_WinExemple.h"
- #include <QMainWindow>
- class WinExemple : public QMainWindow, public Ui::WinExemple {
- Q_OBJECT
- public:
- WinExemple(QWidget *parent = 0, Qt::WFlags fl = 0);
- ~WinExemple();
- public slots:
- private:
- };
- #endif
[modifier] Fichier WinExemple.cpp
- //
- // C++ Implementation: WinExemple
- //
- // Description:
- //
- //
- // Author: Emeric Verschuur <contact@openihs.org>, (C) 2008
- //
- // Copyright: See COPYING file that comes with this distribution
- //
- //
- #include "WinExemple.h"
- WinExemple::WinExemple(QWidget* parent, Qt::WFlags fl)
- :QMainWindow(parent, fl) {
- setupUi(this);
- }
- WinExemple::~WinExemple() {
- }
[modifier] Fichier main.cpp
- //
- // C++ Implementation: main
- //
- // Description:
- //
- //
- // Author: Emeric Verschuur <contact@openihs.org>, (C) 2008
- //
- // Copyright: See COPYING file that comes with this distribution
- //
- //
- #include <QApplication>
- #include "WinExemple.h"
- int main(int argc, char** argv) {
- QApplication app(argc, argv);
- WinExemple win;
- app.setActiveWindow(&win);
- win.show();
- return app.exec();
- }
[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




