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 nommage Qt
. 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 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 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.
Cette notion d'arbre des objets permet également de débugger plus facilement, via l'appel de méthodes comme QObject::dumpObjectTree()
et Object::dumpObjectInfo()
.
Le moc (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.
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.
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.
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 :
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.
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).