Loading AI tools
infrastructure logicielle orientée objet de création d'interface graphique De Wikipédia, l'encyclopédie libre
Qt (prononcé officiellement en anglais cute (/kjuːt/) mais couramment prononcé Q.T. (/ˈkjuː.ˈtiː/)[3]) est :
Créateur | Haavard Nord (d) et Eirik Chambe-Eng (d) |
---|---|
Développé par |
|
Première version | |
Dernière version | 6.8 ()[1] |
Dépôt | code.qt.io/cgit/qt/qtbase.git |
État du projet | Actif |
Écrit en | C++ |
Système d'exploitation | GNU/Linux, Microsoft Windows, macOS, BSD, Android et iOS |
Environnement | GNU/Linux, Windows, Windows CE, Mac OS X, BSD, Unix, Symbian OS, Maemo, Tizen, Genode |
Formats lus | Qt Message (d), Qt User Interface (d), Qt Translation source file (d), Qt Assistant Documentation Profile (d), Qt Assistant Content File (d), Qt Resource Collection (d) et Qt Jambi User Interface (d) |
Formats écrits | Qt Message (d), Qt User Interface (d), Qt Translation source file (d), Qt Assistant Documentation Profile (d), Qt Assistant Content File (d), Qt Resource Collection (d) et Qt Jambi User Interface (d) |
Type | création d'interfaces graphique |
Licence | GNU GPL v2, GNU LGPL 3 à partir de Qt 5.7 [2] |
Documentation | doc.qt.io |
Site web | www.qt.io |
Qt permet la portabilité des applications qui n'utilisent que ses composants par simple recompilation du code source. Les environnements pris en charge sont les Unix (dont GNU/Linux) qui utilisent le système graphique X Window System ou Wayland, Windows, Mac OS X, Tizen et également Genode. Le fait d'être une bibliothèque logicielle multiplateforme attire un grand nombre de personnes qui ont donc l'occasion de diffuser leurs programmes sur les principaux OS existants.
Qt intègre des bindings avec plus d'une dizaine de langages autres que le C++, comme Ada, C#, Java, Python, Ruby, Visual Basic, etc.
Qt est notamment connu pour être le framework sur lequel repose l'environnement graphique KDE Plasma, l'un des environnements de bureau par défaut de plusieurs distributions GNU/Linux.
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[4]. Deux ans plus tard, avec Chambe-Eng, ils développent une application multiplateforme (Unix, Macintosh et Windows) et commencent sérieusement à réfléchir à la conception d'une bibliothèque graphique multiplateforme 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[4].
Quasar Technologies est créé le et renommé six mois plus tard en Troll Tech, puis Trolltech, puis Qt Software et enfin Qt Development Frameworks. Les débuts sont particulièrement difficiles financièrement. Mais ils ont la chance d'être mariés : leurs femmes subviennent à leurs besoins[4].
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 signifie « mignon ». Le t étant minuscule, ne pas prononcer cutie (/ˈkjuː.ti/) : ce n'est pas un sigle (QT)[4].
C'est en 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 [4].
Le est annoncée la première version publique de Qt sur le newsgroup comp.os.linux.announce[5]. Et un an plus tard la version 0.97, puis le la version 1.0 est publiée et annoncée quelques jours plus tard[6].
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.
La seconde version majeure de Qt est publiée en 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)[7].
Les deux premières versions majeures de Qt sont disponibles uniquement pour X11 et Windows, la prise en charge de Mac OS X arrive avec la version 3.0, publiée en 2001. Par rapport à la version 2.0, cette nouvelle version apporte une meilleure prise en charge de l'internationalisation, de l'Unicode ou encore des expressions rationnelles comme en Perl.
Le , la version 4 est publiée et améliore notamment le moteur de rendu, désormais appelé Arthur[8], la séparation entre données et présentation et sépare la bibliothèque en modules :
À 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 :
Le , 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 d'abaisser le maximum de barrières pour faciliter l'adoption de Qt, qui depuis est utilisé par leurs développements en interne :
Nokia se recentrant sur Windows, elle cède en l'activité services et gestion des licences commerciales de Qt à la société Digia [11]. Le , elle cède intégralement la gestion du framework Qt à Digia [12] pour une somme de 4,9 millions € (à comparer aux 150 millions de 2008[13]). Digia annonce vouloir étendre l'intégration de Qt à Android, iOS et Windows 8.
Qt 5.0 est sorti le [14]. Bien que marquant des changements majeurs sur bien des points (rôle important de QML et de JavaScript pour la création des interfaces graphiques avec Qt Quick, séparation en modules indépendants pour faciliter les livraisons, couche d'abstraction pour faciliter les portages, etc.), le passage à Qt5 casse au minimum la compatibilité au niveau des sources. De cette façon, le passage est bien plus facile que pour Qt4.
Les versions Qt 5.x utilisent des plugins nécessaires au déploiement du programme.
Qt Quick est un framework libre développé et maintenu par Digia faisant partie de la bibliothèque Qt. Il fournit la possibilité de créer des interfaces utilisateur personnalisables et dynamiques avec des effets de transition fluides de manière déclarative. Ce type d'interface dynamique est de plus en plus commun, notamment sur les smartphones. Qt Quick inclut un langage de script déclaratif appelé QML comparable au XAML créé par Microsoft pour sa bibliothèque WPF.
Qt Quick et QML sont officiellement fournis depuis Qt 4.7 (avec Qt Creator 2.1).
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 les versions GNU/Linux et UNIX 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 GNU/Linux et UNIX dans un premier temps, mais depuis la version 4.0 de Qt, elle est appliquée pour tous les systèmes.
Créée 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[15]. Le rachat de Trolltech par Nokia le ne remet pas en cause la politique de double licence, l'entreprise finlandaise soutient même KDE[16].
Le , 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[17]. 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[18].
Un an plus tard, le , Trolltech annonce qu'à partir de Qt 4.5, Qt sera également disponible sous licence LGPL v2.1[19]. 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 Development Frameworks. 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 priver de cette source de revenus[10].
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
), c'est la typographie camel case. Ces classes ont souvent pour attributs des types énumérés déclarés dans l'espace de nommage Qt
[20]. Mis à part une architecture en pur objet, certaines fonctionnalités basiques sont implémentées par des macros (chaîne de caractères à traduire avec tr
, affichage sur la sortie standard avec qDebug
…).
Les conventions de nommage des méthodes sont assez semblables à celles de Java : le lower camel case est utilisé, c'est-à-dire que tous les mots sauf le premier prennent une majuscule (ex: indicatorFollowsStyle()
), les modificateurs sont précédés par set
, en revanche les accesseurs prennent simplement le nom de l'attribut (ex : text()
) ou commencent par is
dans le cas des booléens (ex : isChecked()
).
Les objets Qt (ceux héritant de QObject
) peuvent s'organiser d'eux-mêmes sous forme d'arbre. Ainsi, lorsqu'une classe est instanciée, on peut lui définir un objet parent. Cette organisation des objets sous forme d'arbre 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 [21].
Cette notion d'arbre des objets permet également de déboguer plus facilement, via l'appel de méthodes comme QObject::dumpObjectTree()
et Object::dumpObjectInfo()
[21].
Le moc[22] (pour Meta Object Compiler) est un préprocesseur qui, appliqué avant compilation du 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 Development Frameworks 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[23].
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çus 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.
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ègle leurs propriétés facilement. Les fichiers d'interface graphique sont formatés en XML et portent l'extension .ui [24].
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 [25] :
QUiLoader
qui se charge d'interpréter le fichier XML .ui
et retourner une instance de classe QWidget
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 UNIX qmake
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.
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 [26].
Dans leur code source, les développeurs entrent des chaînes de caractères dans leur propre langue. Ils doivent permettre la traduction de ces chaînes grâce à la méthode 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.
La bibliothèque embarque divers thèmes de 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) [27].
Qt Development Frameworks fournit un ensemble de logiciels libres pour faciliter le développement d'applications Qt :
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[28] et Visual Studio[29]. Il existe d'autres EDI destinés à Qt et développés indépendamment de Nokia, comme QDevelop et Monkey Studio.
Des bindings existent afin de pouvoir utiliser Qt avec d'autres langages que le C++. Ainsi les langages Ada, C# et Visual Basic (Qt#[30]), D, F# (Qt#), Java (Qt Jambi), OCaml, Perl, PHP, Python[31], Ruby (QtRuby), Scheme peuvent être utilisés[32].
Qt Jambi était un binding de Qt pour le langage Java. En février 2009, Qt Software a annoncé[33] qu'il arrêtait le développement de ce framework après la sortie de la version 4.5 ; il est depuis supporté par la communauté.
Qt Jambi était distribué, du temps de Qt Software, sous deux licences : licence publique générale GNU pour les logiciels libres et une autre licence pour les logiciels propriétaires. Il est actuellement disponible sous LGPL.
De plus en plus de développeurs utilisent Qt, y compris parmi de grandes entreprises. On peut notamment citer : Google, Adobe Systems, Skype ou encore la NASA. Le site de Digia recense les entreprises utilisant Qt et les applications fondées sur Qt[34].
Le classique « Hello World » dans différents langages : C++, Java (avec QtJambi), Python (avec PyQt et PySide) et C# (avec Qyoto) :
TEMPLATE += app
QT += widgets
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton bouton("Hello world!");
bouton.show();
return app.exec();
}
Étudions ces lignes.
#include <QApplication>
: Inclut l'en-tête QApplication
, nécessaire pour pouvoir utiliser la classe QApplication
.
#include <QPushButton>
: Idem, mais pour la classe QPushButton
.
int main(int argc, char *argv[]) {
: Début de la fonction main
exécutée au lancement du programme.
QApplication app(argc, argv);
: Crée un objet QApplication
, cette étape est obligatoire avant d'utiliser des widgets (QWidget
).
QPushButton bouton("Hello world!");
: Crée un objet QPushButton
(qui est un QWidget
). Cet objet se visualise par un bouton qui affiche le texte "Hello world!"
.
bouton.show();
: Appelle la fonction show
de l'objet bouton
pour le rendre visible (par défaut le bouton est invisible).
return app.exec();
: Appelle la fonction exec
de app
, et retourne son résultat. Cette fonction s’exécute jusqu'à ce que l'utilisateur ferme toutes les fenêtres visibles, dans ce cas, jusqu'à ce qu'il ferme la fenêtre correspondant à bouton
.
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_()
from PySide import QtGui
import sys
app = QtGui.QApplication(sys.argv)
hello = QtGui.QPushButton("Hello World!", None)
hello.show()
app.exec_()
using System;
using Qyoto;
public class HelloWorld
{
public static int Main(String[] args) {
QApplication app = new QApplication(args);
QPushButton hello = new QPushButton("Hello world!");
hello.Show();
return QApplication.Exec();
}
}
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.