- Qt toolkit
-
Qt
Qt Développeur Qt Software Dernière version 4.5.3 (le 1er octobre 2009) [+/-] Version avancée 4.6 Preview (le 9 septembre 2009) [+/-] Environnements GNU/Linux, Windows, Windows CE, Mac OS X, BSD, Unix Type Bibliothèque logicielle Licences GNU GPL v3, GNU LGPL 2.1 à partir de Qt 4.5 Site Web http://qt.nokia.com/ Qt est une bibliothèque logicielle orientée objet et développée en C++ par la société Qt Software. Elle offre des composants d'interface graphique (widgets), d'accès aux données, de connexions réseaux, de gestion des fils d'exécution, d'analyse XML, etc. Qt est par certains aspects un framework lorsqu'on l'utilise pour concevoir des interfaces graphiques ou que l'on architecture son application en utilisant les mécanismes des signaux et slots par exemple.
Qt permet la portabilité des applications qui n'utilisent que ces composants par simple recompilation du code source. Les environnements supportés sont les Unix (dont Linux) qui utilisent le système graphique X Window System, Windows et Mac OS X. Le fait d'être une bibliothèque logicielle multiplate-forme attire un grand nombre de personnes qui ont donc l'occasion de diffuser leurs programmes sur les principaux OS existants.
Qt est notamment connu pour être la bibliothèque sur laquelle repose l'environnement graphique KDE, l'un des environnements de bureau les plus utilisés dans le monde Linux.
Sommaire
Histoire
C'est au Norwegian Institute of Technology à Trondheim que Haavard Nord (CEO de Trolltech) et Eirik Chambe-Eng (président de Trolltech) se rencontrent. En 1988, Haavard Nord est chargé par une entreprise suédoise de développer une bibliothèque logicielle en C++ pour gérer une interface graphique, c'est la première fois qu'il commence à aborder le sujet[1]. Deux ans plus tard, avec Chambe-Eng, ils développent une application multiplate-forme (Unix, Macintosh et Windows) et commencent sérieusement à réfléchir à la conception d'une bibliothèque graphique multi-plateforme généraliste.
En 1991, ils entament le développement de cette bibliothèque. L'année suivante, Chambe-Eng propose le principe des « signaux et slots », qui devient la pierre angulaire de Qt. Et en 1993, le noyau de Qt est prêt et permet aux informaticiens de développer leurs propres composants graphiques. C'est à la fin de cette année que Haavard Nord propose de créer une entreprise pour commercialiser leur bibliothèque[1].
Quasar Technologies est créé le 4 mars 1994 et renommé six mois plus tard en Troll Tech, puis Trolltech, et enfin Qt Software. Les débuts sont particulièrement difficiles financièrement. Mais ils ont la chance d'être mariés : leurs femmes subviennent à leurs besoins[1].
Le projet a été nommé Qt parce que le caractère « Q » était joli dans l'écriture Emacs de Haavard, et le « t » provient de Xt Xtoolkit. Le tout se prononçant en anglais cute, ce qui se traduit par « mignon ». Le « t » étant minuscule, ne pas prononcer cutie. Ce n'est pas un sigle (QT)[1].
C'est en avril 1995 que Trolltech a son premier client, l'entreprise norvégienne Metis. Et durant presque un an, elle n'en a pas d'autre, rendant l'entreprise très fragile financièrement. Son second client, l'Agence spatiale européenne (ESA), lui achète dix licences en mars 1996[1].
Qt1
Le 26 mai 1995 est annoncée la première version publique de Qt sur le newsgroup comp.os.linux.announce[2]. Et un an plus tard la version 0.97, puis le 24 septembre 1996 la version 1.0 est publiée et annoncée quelques jours plus tard[3].
C'est en 1997 que le projet KDE est lancé par Matthias Ettrich (qui est embauché par Trolltech l'année suivante). Ce dernier prend la décision d'utiliser Qt comme bibliothèque de base. Le fait qu'un projet de cette envergure utilise Qt sera une très bonne publicité pour Trolltech et sa bibliothèque. Depuis, les liens entre Trolltech et KDE n'ont fait que se renforcer.
Qt2
La seconde version majeure de Qt est publiée en juin 1999 et une version pour les systèmes embarqués, Qt/Embedded, connue depuis sous le nom de Qtopia, est publiée en 2000. Cette dernière version est conçue pour Linux et utilise directement son framebuffer, sans passer par le système de fenêtrage X11 (qui est inadapté pour les systèmes embarqués)[4].
Qt3
Les deux premières versions majeures de Qt sont disponibles uniquement pour Unix et Windows, le support de Mac OS X arrive avec la version 3.0, publiée en 2001. Par rapport à la version 2.0, cette nouvelle version apporte un meilleur support de l'internationalisation, de l'Unicode ou encore des expressions rationnelles comme en Perl.
Qt4
Le 28 juin 2005, la version 4 est publiée et améliore notamment le moteur de rendu, la séparation entre données et présentation et sépare la bibliothèque en modules :
- QtCore : pour les fonctionnalités non graphiques utilisées par les autres modules ;
- QtGui : pour les composants graphiques ;
- QtNetwork : pour la programmation réseau ;
- QtOpenGL : pour l'utilisation d'OpenGL ;
- QtSql : pour l'utilisation de base de données SQL ;
- QtXml : pour la manipulation et la génération de fichiers XML ;
- QtDesigner : pour étendre les fonctionnalités de Qt Designer, l'assistant de création d'interfaces graphiques ;
- QtAssistant : pour l'utilisation de l'aide de Qt ;
- Qt3Support : pour assurer la compatibilité avec Qt 3.
À cela s'ajoute pour la version commerciale sous Windows deux autres modules liés à l'utilisation d'ActiveX : QAxContainer et QAxServer.
Avec l'évolution de Qt 4, d'autres modules sont conçus :
- QtDBus : pour la communication inter-processus en utilisant D-Bus (uniquement sous Unix à partir de Qt 4.2) ;
- QtSvg : pour l'affichage d'images aux formats SVG (à partir de Qt 4.1) ;
- QtUiTools : pour charger dynamiquement les interfaces graphiques créées avec Qt Designer (à partir de Qt 4.1) ;
- QtTest : pour effectuer des tests unitaires (à partir de Qt 4.1) ;
- QtScript : pour l'évaluation de scripts utilisant Qt Script (à partir de Qt 4.3) ;
- QtWebKit : portage du moteur de rendu web WebKit (à partir de Qt 4.4) ;
- QtXmlPatterns : pour manipuler des documents XML via XQuery et XPath (à partir de Qt 4.4) ;
- Phonon : intégration de Phonon, framework multimédia de KDE 4, développé en collaboration avec la communauté KDE (à partir de Qt 4.4) ;
- QtScriptTools : divers outils pour QtScript comme un débogueur (à partir de Qt 4.5).
Le 28 janvier 2008, Nokia lance une OPA amicale pour racheter Qt et Trolltech. Trolltech, renommé en Qt Software, devient une division de Nokia. Dès lors, Nokia prend la décision en janvier 2009 d'abaisser le maximum de barrières pour faciliter l'adoption de Qt, qui depuis est utilisé par leur développements en interne :
- ajout d'une licence plus permissive que la GPL, la LGPL ;
- ouverture du développement à des développeurs externes en rendant accessible le dépôt de Qt[5].
Licences
Le projet d'environnement graphique KDE a dès le début utilisé la bibliothèque Qt. Mais avec le succès de cet environnement, une certaine partie de la communauté du logiciel libre a critiqué la licence de Qt qui était propriétaire et incompatible avec la GNU GPL utilisée par KDE. Ce problème fut résolu par la société Trolltech qui mit la version Unix/Linux de Qt sous licence GNU GPL lorsque l'application développée était également sous GNU GPL. Pour le reste, c'est la licence commerciale qui entre en application. Cette politique de double licence a été appliquée uniquement pour Unix dans un premier temps, mais depuis la version 4.0 de Qt, elle est appliquée pour tous les systèmes.
Créé en juin 1998, la fondation KDE Free Qt Foundation est chargée de s'assurer de la disponibilité de Qt pour le développement de logiciels libres. Dans le cadre d'un accord avec Trolltech, cette fondation a le droit de diffuser Qt sous une licence de style BSD dans le cas où Trolltech cesserait le développement de la version libre pour diverses raisons, y compris un dépôt de bilan[6]. Le rachat de Trolltech par Nokia le 28 janvier 2008 ne remet pas en cause la politique de double licence, l'entreprise finlandaise soutient même KDE[7].
Le 18 janvier 2008, Trolltech annonce que la version 3 et 4 de Qt sont à partir de cette date sous licence GPLv2 et GPLv3. Ce changement de version ne s'applique que pour les versions libres de Qt. Ainsi la version 3 de Qt pour Windows, qui n'est pas libre, ne voit pas sa licence changer[8]. Ce changement s'inscrit dans le désir de KDE de passer également en version 3 de la GPL, en plus de la version 2 déjà utilisée[9].
Un an plus tard, le 14 janvier 2009, Trolltech annonce qu'à partir de Qt 4.5, Qt sera également disponible sous licence LGPL v2.1[10]. Cette nouvelle licence permet ainsi des développements de logiciels propriétaires, sans nécessiter l'achat d'une licence commerciale auprès de Qt Software. Ce changement, voulu par Nokia pour faire en sorte que Qt soit utilisé par un maximum de projets, est rendu possible par le fait que Nokia peut se passer des ventes des licences commerciales, contrairement à Trolltech qui ne pouvait pas se passer de cette source de revenus[5].
Architecture
Structure générale
L'API Qt est constituée de classes aux noms préfixés par Q et dont chaque mot commence par une majuscule (ex:
QLineEdit
). Ces classes ont souvent pour attributs des types énumérés déclarés dans l'espace de nommageQt
[11]. Mis à part une architecture en pur objet, certaines fonctionnalités basiques sont implémentées par des macros (chaîne de caractères à traduire avectr
, affichage sur la sortie standard avecqDebug
...).Les conventions de nommage des méthodes sont assez semblables à celles de Java : le lowerCamelCase est utilisé, c'est à dire que tous les mots sauf le premier prennent une majuscule (ex:
indicatorFollowsStyle()
), les modificateurs sont précédés parset
, en revanche les accesseurs prennent simplement le nom de l'attribut (ex :text()
) ou commencent paris
dans le cas des booléens (ex :isChecked()
).Arborescence des objets
Les objets Qt (ceux héritant de
QObject
) peuvent s'organiser d'eux même sous forme d'arbre. Ainsi, lorsqu'une classe est instanciée, on peut lui définir un objet parent. Cette gestion des objets par arborescence facilite la gestion de la mémoire car avant qu'un objet parent ne soit détruit, Qt appelle récursivement le destructeur de tous les enfants [12].Cette notion d'arbre des objets permet également de débugger plus facilement, via l'appel de méthodes comme
QObject::dumpObjectTree()
etObject::dumpObjectInfo()
[12].Compilateur de meta-objets
Le moc[13] (pour Meta Object Compiler) est un préprocesseur qui, appliqué avant compilation au code source d'un programme Qt, génère des meta-informations relatives aux classes utilisées dans le programme. Ces meta-informations sont ensuite utilisées par Qt pour fournir des fonctions non disponibles en C++, comme les signaux et slots et l'introspection.
L'utilisation d'un tel outil additionnel démarque les programmes Qt du langage C++ standard. Ce fonctionnement est vu par Qt Software comme un compromis nécessaire pour fournir l'introspection et les mécanismes de signaux. À la sortie de Qt 1.x, les implémentations des templates par les compilateurs C++ n'étaient pas suffisamment homogènes[14].
Signaux et slots
Article détaillé : Signaux et slots.Les signaux et slots sont une implémentation du patron de conception observateur. L'idée est de connecter des objets entre eux via des signaux qui sont émis et reçu par des slots. Du point de vue du développeur, les signaux sont représentés comme de simples méthodes de la classe émettrice, dont il n'y a pas d'implémentation. Ces "méthodes" sont par la suite appelées, en faisant précéder "emit", qui désigne l'émission du signal. Pour sa part, le slot connecté à un signal est une méthode de la classe réceptrice, qui doit avoir la même signature (autrement dit les mêmes paramètres que le signal auquel il est connecté), mais à la différence des signaux, il doit être implémenté par le développeur. Le code de cette implémentation représente les actions à réaliser à la réception du signal.
C'est le MOC qui se charge de générer le code C++ nécessaire pour connecter les signaux et les slots.
Concepteur d'interface
Qt Designer est un logiciel qui permet de créer des interfaces graphiques Qt dans un environnement convivial. L'utilisateur, par glisser-déposer, place les composants d'interface graphique et y règles leurs propriétés facilement. Les fichiers d'interface graphique sont formatés en XML et portent l'extension .ui [15].
Lors de la compilation, un fichier d'interface graphique est converti en classe C++ par l'utilitaire
uic
. Il y a plusieurs manières pour le développeur d'employer cette classe [16] :- l'instancier directement et connecter les signaux et slots
- l'agréger au sein d'une autre classe
- l'hériter pour en faire une classe mère et ayant accès ainsi à tous les éléments constitutifs de l'interface créée
- la générer à la volée avec la classe
QUiLoader
qui se charge d'interpréter le fichier XML.ui
et retourner une instance de classeQWidget
qmake
Qt se voulant un environnement de développement portable et ayant le MOC comme étape intermédiaire avant la phase de compilation/édition de liens, il a été nécessaire de concevoir un moteur de production spécifique. C'est ainsi qu'est conçu le programme
qmake
.Ce dernier prend en entrée un fichier (avec l'extension
.pro
) décrivant le projet (liste des fichiers sources, dépendances, paramètres passés au compilateur, etc...) et génère un fichier de projet spécifique à la plateforme. Ainsi, sous les systèmes UNIXqmake
produit un Makefile qui contient la liste des commandes à exécuter pour génération d'un exécutable, à l'exception des étapes spécifiques à Qt (génération des classes C++ lors de la conception d'interface graphique avec Qt Designer, génération du code C++ pour lier les signaux et les slots, ajout d'un fichier au projet, etc...).Le fichier de projet est fait pour être très facilement éditable par un développeur. Il consiste en une série d'affectations de variables. En voici un exemple pour un petit projet:
TARGET = monAppli SOURCES = main.cpp mainwindow.cpp HEADERS = mainwindow.h FORMS = mainwindow.ui QT += sql
Ces déclarations demandent que l'exécutable soit nommé monAppli, donne la liste des fichiers sources, en-têtes et fichiers d'interface graphique. La dernière ligne déclare que le projet requiert le module SQL de Qt.
Internationalisation
Qt intègre son propre système de traduction, qui n'est pas foncièrement différent dans le principe de la bibliothèque gettext. Selon le manuel de Qt Linguist, l'internationalisation est assurée par la collaboration de trois types de personnes : les développeurs, le chef de projet et les traducteurs [17].
Dans leur code source, les développeurs entrent des chaînes de caractères dans leur propre langue. Il doivent permettre la traduction de ces chaînes grâce à la macro
tr()
. En cas d'ambiguïté sur le sens d'une expression, ils peuvent également indiquer des commentaires destinés à aider les traducteurs.Le chef de projet déclare les fichiers de traduction (un pour chaque langue) dans le fichier de projet. L'utilitaire
lupdate
parcourt les sources à la recherche de chaînes à traduire et synchronise les fichiers de traduction avec les sources. Les fichiers de traductions sont des fichiers XML portant l'extension .ts.Les traducteurs utilisent Qt Linguist pour renseigner les fichiers de traduction. Quand les traductions sont finies, le chef de projet peut compiler les fichiers .ts à l'aide de l'utilitaire
lrelease
qui génère des fichiers binaires portant l'extension .qm, exploitables par le programme. Ces fichiers sont lus à l'exécution et les chaînes de caractères qui y sont trouvées remplacent celles qui ont été écrites par les développeurs.Style
La bibliothèque embarque divers thèmes des widgets qui lui donnent une bonne intégration visuelle sur toutes les plateformes, sur les environnements de bureau GNOME, Mac OS X et Windows les applications Qt ont ainsi l'apparence d'applications natives.
Qt permet de personnaliser l'apparence des différents composants d'interface graphique en utilisant le principe des feuilles de style en cascade (CSS) [18].
Outils de développement
Qt Software fournit un ensemble de logiciels libres pour faciliter le développement d'applications Qt:
- Qt Designer est un concepteur d'interface graphique, il enregistre les fichiers .ui
- Qt Assistant permet de visualiser la documentation complète de Qt hors-ligne
- Qt Linguist est un outil dédié aux traducteurs, il leur permet d'ouvrir les fichiers .ts qui contiennent les chaînes de caractères à traduire, et d'entrer ensuite leur traduction
- Qt Creator est l'environnement de développement intégré dédié à Qt et facilite la gestion d'un projet Qt. Son éditeur de texte offre les principales fonctions que sont la coloration syntaxique, le complètement, l'indentation, etc... Qt Creator intègre en son sein les outils Qt Designer et Qt Assistant.
- Qt Demo présente un ensemble de petits programmes (sous forme d'exécutables et de sources) qui montrent les fonctionnalités offertes par la bibliothèque.
Même si Qt Creator est présenté comme l'environnement de développement de référence pour Qt, il existe des modules Qt pour les environnements de développement Eclipse [19] et Visual Studio [20]. Il existe d'autres EDI dédiés à Qt et développés indépendamment de Nokia: QDevelop et Monkey Studio.
Bindings
Des bindings existent afin de pouvoir utiliser Qt avec d'autres langages que le C++. Ainsi les langages Java (Qt Jambi [21]), Python (PyQt, PySide, PythonQt), Ruby (QtRuby), Ada (QtAda), C# (Qyoto), Pascal ( FreePascal Qt4), Perl ( Perl Qt4), PHP (PHP-Qt), Haskell ( Qt Haskell ), Lua (lqt, QtLua), Dao (DaoQt), Tcl ( qtcl), Common Lisp (CommonQt), D ( QtD ) peuvent être utilisés.
Utilisations
Voir la catégorie : Logiciel utilisant Qt.De plus en plus de développeurs utilisent Qt, y compris parmi de grandes entreprises. On peut notamment citer : Google, Adobe Systems ou encore la NASA. Le site de Trolltech recense les entreprises utilisant Qt et les applications basées sur Qt[22].
Syntaxe
Le classique Hello World en C++
#include <QApplication> #include <QPushButton> int main( int argc, char *argv[] ) { QApplication app(argc, argv); QPushButton hello("Hello world!"); hello.show(); return app.exec(); }
import com.trolltech.qt.gui.QApplication; import com.trolltech.qt.gui.QPushButton; public class HelloWorld { public static void main(String args[]) { QApplication.initialize(args); QPushButton hello = new QPushButton("Hello World!"); hello.show(); QApplication.exec(); } }
from PyQt4 import QtGui, QtCore import sys app = QtGui.QApplication(sys.argv) hello = QtGui.QPushButton("Hello World!", None) hello.show() app.exec_()
Notes et références
- ↑ a , b , c , d et e (en) Jasmin Blanchette et Mark Summerfield, C++ GUI Programming with Qt 4, Prentice Hall, 21 juin 2006, 560 p. (ISBN 978-0-13-187249-3), « A Brief History of Qt »
- ↑ (en) Beta of Motif-like C++ library available, 26 mai 1995, Trolltech. Consulté le 13 décembre 2007
- ↑ (en) Qt 1.0 released (c++ gui library), 1er octobre 1996, Trolltech. Consulté le 13 décembre 2007
- ↑ (en) Qtopia Core, 2007, Trolltech. Consulté le 7 janvier 2008
- ↑ a et b Aaron Seigo, « Qt goes LGPL! », 14 janvier 2009. Mis en ligne le 14 janvier 2009, consulté le 14 janvier 2009
- ↑ (fr) KDE Free Qt Foundation, KDE. Consulté le 28 janvier 2008
- ↑ (en) Open letter to KDE and the Open Source community - Joint announcement, 28 janvier 2008, Trolltech et Nokia. Mis en ligne le 28 janvier 2008, consulté le 28 janvier 2008
- ↑ (en) Trolltech releases Qt under the GPL v3 license, 18 janvier 2008, Trolltech. Mis en ligne le 18 janvier 2008, consulté le 19 janvier 2008
- ↑ (fr) Projects/KDE Relicensing, KDE. Consulté le 19 janvier 2008
- ↑ (en). LGPL License Option Added to Qt, 14 janvier 2009, Trolltech. Mis en ligne le 14 janvier 2009, consulté le 14 janvier 2009
- ↑ http://doc.trolltech.com/qq/qq13-apis.html
- ↑ a et b (en) Object Trees and Object Ownership, 2009, Qt Software. Consulté le 18 juin 2009
- ↑ (en) Utilisation du moc
- ↑ (en) Pourquoi Qt n'utilise pas les templates pour les signaux et les slots ?
- ↑ (en) Qt Designer's UI File Format, 2009, Qt Software. Consulté le 17 juin 2009
- ↑ (en) Using a Designer .ui File in Your Application, 2009, Qt Software. Consulté le 17 juin 2009
- ↑ (en) Qt Linguist Manual, 2009, Qt Software. Consulté le 23 juin 2009
- ↑ (en) Qt Style Sheets, 2009, Qt Software. Consulté le 23 juin 2009
- ↑ (en) Qt Eclipse Integration for C++, 2009, Qt Software. Consulté le 23 juin 2009
- ↑ (en) Qt Visual Studio .NET Integration, 2008, Qt Software. Consulté le 23 juin 2009
- ↑ initialement développé par Qt Software, le support de ce binding est abandonné en février 2009 et sa maintenance est laissé à la communauté suite à la libération du code source
- ↑ (en) Applications et entreprises utilisant Qt
Voir aussi
Liens connexes
- QPL, la licence d'origine de Qt
- Autres bibliothèques généralistes multi-plateformes
- GTK+, utilisée par l'environnement graphique GNOME
- wxWidgets, utilisée notamment par aMule
- Qt Extended, version embarquée de Qt
Liens externes
- (en) Site officiel
- (en) Documentation de l'API de Qt
- Portail de l’informatique
- Portail des logiciels libres
Catégories : Qt | Bibliothèque logicielle graphique libre | C++ | KDE
Wikimedia Foundation. 2010.