Articles

Divers

QT : créer des applications Mac, PC et Linux sans changer le code source !

Par Didier Pulicani - Publié le

QT en quelques mots



QT : créer des applications Mac, PC et Linux sans changer le code source !
Les initiales QT évoquent chez les MacUsers que nous sommes, une référence à QuickTime. Pourtant, QT n'a rien à voir avec Apple, puisqu'il s'agit en réalité d'un environnement de programmation multi-plateforme, créé par la société TrollTech. Il vous permet donc de créer avec le même code source, des applications portables aussi bien pour Linux, Windows que pour Mac.

Niveau requis pour cet article



Sachez tout d'abord qu'avant de se mettre à QT, il faudra maîtriser le C/C++. Le niveau requis n'est pas très élevé, mais vous vous devez tout de même avoir en tête un certain nombre de concepts de programmation orientée objet, d'héritage etc. Nous avons d'ailleurs publié quelques tutoriels à ce sujet, si vous fouillez un peu sur Mac4Ever ;--)

Comment ça marche ?



Vous savez tous qu'une application PC (compilée sur Pentium/AMD) ne fonctionne pas sur Mac. Ceci est une évidence, car les applications sont crées à partir du code source, que l'on compile pour un processeur et un système d'exploitation bien précis. Dans QT, seul le code source est donc portable, il vous faudra bien évidemment recompiler votre programme pour chaque environnement, mais sans rien réécrire !

QT : créer des applications Mac, PC et Linux sans changer le code source !


Quels sont les outils disponibles ?



QT est vraiment très complet. Il se compose d'un éditeur graphique, pour créer vos fenêtres et vos classes (exactement comme pour Interface Builder d'Apple), d'un compilateur spécifique, et de librairies. Ceci étant les principaux composants de QT. Vous trouverez en périphérie, d'autres outils (des compilateurs spécifiques etc) et des exemples prêts à compiler, très utiles pour débuter.

Téléchargement et Installation



La version 3.x de QT est disponible en cliquant ici. Sachez par ailleurs que les versions Unix sont en général bien plus en avance que les versions Windows, et en particulier pour les versions gratuites, celles que nous allons utiliser. (A l'heure où je vous parle, on a largement atteint la version 3 sur Mac alors que sous Windows, c'est pour le moment la version 2 qui est gratuite).

Une fois le .tar téléchargé, sachez que l'installation n'est pas pour autant terminée. Vous trouverez dans le dossier, une fois décompressé, un fichier standard Install.txt, qu'il faudra donc placer dans Text Edit ou autre, et donc exécuter les indications scrupuleusement.

Le procédure est décrite assez clairement, en anglais cependant, et je ne m'attarderait pas trop sur ce point car il n'y a pas tellement de difficultés.

Petit détail assez utile, on vous demande de créer des variables d'environnement en milieu d'installation. Cela consiste à créer un fichier .profile (ou .login, suivant votre terminal) dans lequel vous collerez les procédures données dans le fichier d'installation. Faites attention, un tel fichier ne peut être créé à partir de TextEdit, je vous conseille d'utiliser BBEdit. D'autre part, le système refusera peut-être d'enregistrer le nom .profile. Appelez le tout simplement "profile" et vous le renommerez avec le terminal. (mv profile .profile)

Le reste de l'installation est assez facile mais prendra un certain temps, car QTDesigner, ainsi que tous les exemples fournis, ne sont pas compilés. Il y en a pour une bonne heure si vous avez un petit G4, 20mn avec un G5 ou un G4 Dual.

Dernier point, lors de mes tests, j'ai eu quelques soucis avec les librairies QT, dont l'installation crée des alias dans le dossier "lib", et pour je ne sais quelle raison, ne fonctionnent pas toujours. Je vous conseille, si vous avez le même bug, de placer directement une copie de ces librairies dans le dossier "lib". Mais a priori, vous n'avez pas besoin de cela...

C++ et langage QT



QT n'est pas seulement un système de librairies graphiques, c'est avant tout un véritable environnement de programmation, comme cocoa par exemple. Je veux dire par là que, même si il est possible, et d'ailleurs conseillé pour certaines fonctions, de programmer en C++, sachez que QT possède ses propres méthodes, constructeurs etc. En clair, au lieu de créer un char* par exemple, vous aurez tout intérêt à utiliser les QString, bien plus adaptées pour interagir avec l'interface graphique. Mais ceci n'est qu'un exemple, il existe aussi les QLists, QFile, QFont etc.

Toute la documentation sur les définitions des headers et des fonctions est incluse, et au format html. C'est clair, vraiment bien documenté et complet au possible.

Mon premier programme



Nous allons créer un programme assez simple, puisqu'il vous permet tout simplement d'écrireMac4Ever ! dans une fenêtre. Ce programme sera écrit entièrement à la main, sans utiliser QTDesigner. C'est plus simple pour débuter.

Pour cela, nous allons définir trois fichiers :

• Main.cpp, le fichier principal de l'application, qui sera chargé de lancer la fenêtre.
mafenetre.cpp qui gérera donc les composants de ladite fenêtre.
mafenetre.h, le fichier d'en-tête des fonctions et des déclarations de mafenetre.cpp

Voici à quoi ressemble un main typique de QT :

#include qapplication.h
#include mafenetre.h
int main(int argc, char* argv ) {
QApplication a( argc, argv );
mafenetre win;
a.setMainWidget(win);
return a.exec();
}


Je ne détaille pas tout, mais cette fonction principale se contente de déclarer une nouvelle fenêtre principale (win), une nouvelle application (a) et de l'ouvrir. (a.exec(); ouvre la fenêtre)

Maintenant, nous allons placer un seul et unique composant sur la fenêtre, à savoir un QLineEdit (un champ de texte si vous voulez).

Voici à quoi le fichier mafenetre.h va ressembler :

#ifndef mafenetre_H
#define mafenetre_H

#include qwidget.h
#include qlineedit.h

class mafenetre : public QWidget
{
Q_OBJECT
public:
mafenetre();
private:
QLineEdit ]le1;
private slots :
void affiche();
};
#endif


Là aussi, rien de bien complexe :
- votre fenêtre est une fenêtre dérivée de QWidget, qui est la fenêtre mère en QT.
- Q_Object est en fait, simplement une macro qui permet de traduire le language objet de QT en C++
- en privé, on définit un pointeur sur un élément de type QLineEdit
- la fonction affichetexte() affichera "Mac4Ever !" sur votre fenêtre lorsque vous cliquerez sur le bouton.
- n'oubliez pas d'inclure les bon headers ! (qlineedit.h si vous utilisez des QLineEdit etc.)

Passons maintenant à l'implémentation, soit le fichier fenetre.cpp :


#include "mafenetre.h"
#include qpushbutton.h
#include qlabel.h

// on définit maintenant le contructeur de la fenêtre, à savoir sa position
//sa taille etc.. On lui ajoute aussi un QPushButton et un QLabel (du texte)

mafenetre::mafenetre()
{
setGeometry(100,100,300,160);
QLabel *la;
la=new QLabel("Le texte va s'afficher ici : ",this);
la->setFixedSize(200,20);
la->move(50,20);
le1=new QLineEdit(this);
le1->setFixedSize(200,20);
le1->move(50,50);

QPushButton * b=new QPushButton("Affiche",this);
b->setFixedSize(100,40);
b->move(80,80);
connect(b, SIGNAL(clicked()), SLOT(affiche()) );
show();
}
void mafenetre::affiche()
{
QString s;
s="Mac4Ever";
le1->setText(s);
}


Vous avez donc maintenant 3 fichiers distincts, et nous allons procéder à la compilation. Pour cela, dans le terminal, tapez :

cd votredossierduprogramme
validez
qmake -project
validez
qmake
validez
make
validez

Cette procédure crée 3 choses :
- le fichier votreprogramme.pro, qui est un peu le "sommaire" de votre programme. (Le .xcode si vous voulez !)
- le fichier makefile, qui contient les instructions de compilation
- enfin votre application, créé en tapant "make"

QT : créer des applications Mac, PC et Linux sans changer le code source !


C'est à ce moment là qu'il peut y avoir quelques erreurs, à vous de les corriger ;-)

Je vous conseille de travailler avec BBEdit, qui est disponible en FreeWare sur versiontracker...

QTDesigner, comment ça marche ?

Nous avons créé un fichier mafenetre.cpp et .h à la main. Sachez que cette procédure fastidieuse peut être exécutée avec un éditeur graphique (QTDesigner), bien plus adapté. Le principe est le suivant :

• On crée une nouvelle fenêtre avec QTDesigner (exemple : mafenetreGUI)

QT : créer des applications Mac, PC et Linux sans changer le code source !


• On connecte directement dans QTDesigner les boutons aux slots prédéfinis (c'est à dire à vos fonctions, que vous définirez plus tard, par héritage, mais on y reviendra)
• on enregistre le fichier mafenetreGUI.ui et on lance le terminal
• les fichiers ".ui" ne sont pas directement exécutables, car ils sont en XML et non en C++. Vous devez les transformer en fichier C++ pour les intégrer à votre programme.(même si la version 3 prend en charge directement le XML dans le terminal, ce n'est pas encore le cas sous Windows en version 2... Je vous conseille de le faire) Pour cela, vous appelez uic, qui est dans votre dossier QT. La procédure est la suivante :

$$CODE0$$

Maintenant, vous avez donc créé l'interface et les slots. Il ne reste plus qu'à programmer mafenetre.cpp et mafenetre.h, Ici, au lieu de la faire hériter de QWidget, vous la faites hériter de mafenetreGUI ! C'est tout simple, et vous n'avez donc plus à donner les dimensions, à créer les boutons, à les déplacer etc... Simplement, à implémenter vos fonctions. Regardez bien les exemples fournis, ils sont très explicites.

Le prix de la portabilité

Petite détail qui a son importance : vous ne pouvez exécuter vos applications que si vous avez les 2 bibliothèques de QT installées sur votre machine. Si vous voulez donner vos applications à vos amis, il faut soit leur faire installer ces librairies, soit faire un script qui le fait au lancement du programme ou indépendamment.

QT : créer des applications Mac, PC et Linux sans changer le code source !


Il faut avouer que pour un petit programme de quelques centaines de Ko, c'est assez contraignant de devoir fournir des libs de 5MO. C'est moins gênant pour de gros projets, principal intérêt de QT. Mais c'est le prix de la portabilité ;--)

Un exemple, Photoshop Album a été créé en QT ! Comme quoi, ce n'est pas simplement un langage éducatif, mais cela peut permettre de concevoir de réels projets !

Conclusion

Voilà donc un aperçu de QT. Je ne suis pas trop entré dans les détails, car on pourrait en écrire des livres entiers. Pour l'avoir utilisé pendant 6 mois de façon assez intensive, je peux vous dire que c'est absolument génial de créer des applications 100% multi-plateformes, sans avoir à retoucher le code et l'adapter pour chaque OS/CPU. Inversement, questions simplicité d'utilisation, il va sans dire qu'il y a quelques astuces à prendre et qu'on ne retrouve pas non plus la légèreté des Developper Tools. Le but n'est toutefois pas le même, XCode étant évidemment principalement destiné à la programmation pour Mac OS X uniquement.

Notons que sur PC, il est possible de compiler avec VisualC++ alors que sur Mac, on attend toujours le plug-in pour XCode... Cela permet surtout plus de confort et évidemment, tout le débuggage facilité...