mercredi 5 décembre 2012

Qt Sample in Visual Studio

J'ai un exemple Qt : WorldTimeclockBuilder que je souhaite utiliser comme base de départ pour développer. Il me faut intégrer cet exemple dans un projet Visual Studio.

Cet exemple se trouve sur mon disque dur à l'emplacement suivant :

C:\Qt\4.8.3\examples\designer\worldtimeclockbuilder

Sur le réseau, je trouve de la documentation; ici :
http://doc.qt.digia.com/qt/designer-worldtimeclockbuilder.html

Comment intégrer cet exemple dans un projet Qt4 Visual Studio ? Voilà la question que je vais tenter d’élucider.

Observons le fichier UI : form.ui

C'est ce fichier qui va donner les informations permettant de créer un projet au plus prêt de ce dont on a besoin.
Avec Qt Designer on observe que form.ui est constitué de 3 objets principaux :
WorldTimeForm : la form principale de l'application est un QWidget
worldTimeClock : un customwidgets
timeEdit
spinBox

Le projet WorldTimeClock

Donc mon projet va s'appeler WorldTimeClock

File->New->Project
Qt project WorldTimeForm
Dans le wizard de création du projet je choisi de renommer le fichier .ui en form.ui et comme class de base une QWidget :
Qt project form.ui et QWidget
Je prends soin de choisir comme Base class une QWidget pour changer un peu ...

J'ai crée ainsi l’arborescence de projet suivante :

Arborescence du projet WorldTimeForm

What's the difference between QMainWindow and QWidget and QDialog?

QWidget is the base class for all drawable classes in Qt. Any QWidget-based class can be shown as a window by showing it when it has no parent.

QDialog is based on QWidget, but designed to be shown as a window. It will always appear in a window, and has functions to make it work well with common buttons on dialogs (accept, reject, etc.).

QMainWindow is designed around common needs for a main window to have. It has predefined places for a menu bar, a status bar, and other widgets. It does not have any built-in allowances for buttons like QDialog does.

En compilant je m'aperçois que form.ui attend un worldtimeclock.h

 <customwidgets>
  <customwidget>
   <class>WorldTimeClock</class>
   <extends></extends>
   <header>worldtimeclock.h</header>
   <container>0</container>
   <pixmap></pixmap>
  </customwidget>
 </customwidgets>

Ajout du Widget WorldTimeClock dans ma solution :
Customer Widget added to project

Wizard de création d'un Qt4 Designer plugin

Custom Widget

Et là c'est le drame !

Malgrés toutes mes tentatives pour configurer correctement les properties de mon projet les .h et les .lib impossible de Linker :

error LNK2019: unresolved external symbol "public: virtual __thiscall QtPluging::~QtPluging(void)" (??1QtPluging@@UAE@XZ) referenced in function _main E:\Qt4 VisualStudio C++\QtApplicationUsingPlugin\QtApplicationUsingPlugin\main.obj QtApplicationUsingPlugin

Remarques :
Un plugin n'est utilisable qu'en release ?! Ah bon mais alors comment fait-on pour le débugger ... En plus cela doit bien vouloir dire quelque part qu'il faut l'installer par exemple dans : C:\Qt\4.8.3\plugins pour l'utiliser. Bref galère en perspective.

Même avec une simple DLL

Bon je vais essayé déjà d'utiliser une simple DLL ...

Même en ne créant qu'un simple projet n'utilisant qu'une simple DLL :

#include "qtapplicationusingqtlib.h"
#include <QtGui/QApplication>

#include "qtlibrary.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtApplicationUsingQtLib w;

QtLibrary MyLib;

w.show();
return a.exec();
}

Projet Qt Application Using QtLib
Ayant bien pris soin de :

Linker properties

Impossible de linker le moindre projet modulaire

error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QtLibrary::~QtLibrary(void)" (__imp_??1QtLibrary@@QAE@XZ) referenced in function _main E:\Qt4 VisualStudio C++\QtApplicationUsingQtLib\QtApplicationUsingQtLib\main.obj QtApplicationUsingQtLib

Et sur Internet comment utilise t-on VS et Qt ?

Quand je lis ce que je lis sur Internet cela fait peur ... 
Pas si simple finalement d'utiliser Qt avec Visual Studio ...
Je vais certainement passer du temps à regarder ce que sont vraiment les fichiers .pro et .pri dont l'Add-In me permet de faire des imports et des exports.

Reprenons l'installe de Qt

Au hasard de mes recherches sur Internet je suis bien tombé sur :

http://portfolio.delinkx.com/files/Qt.pdf

et sur :

http://www.siteduzero.com/tutoriel-3-36553-utiliser-qt-avec-visual-studio-2010.html

mais franchement cela ne donne pas envie.

Ce que je ne comprends pas encore

C'est que le VS Add-In pour Qt semble avoir configuré un certain nombre de choses ... au niveau du template des projets créer, ils compilent se linkent et s'exécutent mais que cela ne fonctionne pas dans le cadre d'une DLL.

Par contre les variables d'environment :

QMAKESPEC=win32-msvc2010
QTDIR=C:\Qt\4.8.3

ne sont pas settées, le PATH non plus n'est pas setté !

Je suis le document suivant :

http://portfolio.delinkx.com/files/Qt.pdf

Je vais setter mes variables et tient je tombe sur le fichier :
C:\Qt\4.8.3\bin\qtvars.bat

Oups, je regarde la date de ce fichier, il a été généré et a une date ultérieure à mon installe de Qt ...
Aurait-il été créé par le configure que j'ai exécuté ? :

STEP 3: CONFIGURE QT FOR YOUR MACHINE
• Run the Visual Studio Command prompt. Start > Program Files > Visual Studio > Visual
Studio Tools > Visual Studio Command Prompt
• Go to the path of your installed Qt e.g. cd C:\Qt\2009.01\qt
• At the prompt type the command configure. E.g. C:\Qt\2009.01\qt> configure
• This will configure Qt for your machine. In case you have multiple compilers installed, and
want to build the Qt library using a specific compiler, you must specify a qmake
specification. This is done by pasing -platform <spec> to configure. E.g. configure -platform
win32-msvc

Je suis en train de me prendre les pieds dans le tapis :

STEP 2: SETTING ENVIRONMENT VARIABLES
• Add this 2 paths to the Environment Variables: “C:\Qt\2009.01\bin” and
“C:\Qt\2009.01\qt\bin”. Note: This path will depend where you install the Qt.
• To add to the path: Control Panel > System > Advanced > Environment Variables
• Select “PATH” under system variables. Click “EDIT” and Add this to the end of the line:
C:\Qt\2009.01\bin; C:\Qt\2009.01\qt\bin (Remember to separate two paths with a “;”)

Bref ! Je suis maintenant convaincu que l'Add-In ne fait pas tout et que j'ai bien fait de lancer la commande configure depuis : C:\Qt\4.8.3

Effectivement c'est énorme, je suppose que la commande C:\Qt\4.8.3\configure.exe utilise le fichier C:\Qt\4.8.3\configure

configure est un fichier de 328 Ko en texte, je regarde un peu dedans par curiosité ...

## This file is the build configuration utility of the Qt Toolkit.

Si je regarde la fin du fichier, je peux y puis lire :

MAKE=`basename "$MAKE"`
echo
echo Qt is now configured for building. Just run \'$MAKE\'.
if [ "$relpath" = "$QT_INSTALL_PREFIX" ]; then
    echo Once everything is built, Qt is installed.
    echo You should not run \'$MAKE install\'.
else
    echo Once everything is built, you must run \'$MAKE install\'.
    echo Qt will be installed into $QT_INSTALL_PREFIX
fi
echo
echo To reconfigure, run \'$MAKE confclean\' and \'configure\'.
echo

Si je comprends bien, on me demande de builder Qt avec >MAKE install et c'est cohérent avec le Step 4 de mon tuto, mais alors pourquoi j'ai pu lancer une application Qt avec VS en Debug, comme à la fin de l'installe, pourquoi cela a t-il fonctionné juste avec l'Add-In ...

Que fait la commande >configure ?

On peut s'y attendre c'est énorme mais entre autres choses utiles :

Création du fichier solution Visual Studio :
C:\Qt\4.8.3\projects.sln
Attention avant de l'ouvrir, il comporte 400 projets. Tous ces fichiers projets .vcxproj ont été créés par le configure.

C:\Qt\4.8.3\translations est touché ajout des répertoires :
C:\Qt\4.8.3\translations\debug
C:\Qt\4.8.3\translations\release
C:\Qt\4.8.3\translations\tmp

dans C:\Qt\4.8.3\bin sont créés :
qmake.exe
qtvars.bat

C:\Qt\4.8.3\mkspecs

C:\Qt\4.8.3\tools
C:\Qt\4.8.3\tools\activeqt\activeqt.sln
C:\Qt\4.8.3\tools\activeqt\Makefile

Ok je MAKE ou plutot nmake

Ok très bien j'ai compris, je suis maintenant convaincu, je vais lancer le make :

STEP 4: BUILDING QT FOR VISUAL STUDIO
• Run nmake at the command prompt
• This takes lots of time. Will build all the demos, examples and libraries.

Bref à vérifier mais je crois bien que le configure fait le make en version 4.8.3

Autre fichier intéressant pour débuter :

C:\Qt\4.8.3\changes-4.8.3

Quand on voit le boulot qui est fait c'est impressionnant !

Aucun commentaire:

Enregistrer un commentaire