Qt : l’infrastructure en C++ pour le développement de logiciels multiplateformes

Les développeurs d’applications le savent bien : la création et la structuration des différents composants sont complexes. Avec leurs composants prêts à l’emploi, les bibliothèques et les infrastructures de développement jouent par conséquent un rôle essentiel. Celles-ci contribuent non seulement à uniformiser le processus de développement mais aussi à le simplifier. L’infrastructure de développement multiplateformes Qt vous épargne par exemple quantité de travail lors du développement d’interfaces graphiques utilisateur et de programmes entiers. Dans ce cadre, l’accent est mis en particulier sur une collaboration sans accroc entre les designers et les développeurs. Cette collaboration est assurée par des composants tels que l’environnement de développement intégré Qt Creator, un langage de balisage propre mais aussi différents modules librement sélectionnables.

Qt : qu’est-ce que c’est ?

Mécontents des outils disponibles pour le développement de logiciels multiplateformes, les Norvégiens Haavard Nord et Eirik Chambe-Eng s’attelèrent en 1990 au développement de Qt. Deux ans plus tard, ils fondaient l’entreprise Trolltech depuis rachetée par le groupe de télécommunication Nokia puis, en 2012, par la société de logiciels finnoise Digia. Depuis 2014, le développement est confié à la filiale de Digia, The Qt Company.

Au fil du temps, Qt s’est développé pour passer d’une simple bibliothèque de classes à un Framework complet, et de nombreux changements ont été apportés au modèle de licence. Le système de double licence actuel, qui laisse à l’utilisateur le choix entre une licence propriétaire et des licences open source GPL et LGPL, permet une utilisation libre ou commerciale.

Qt est programmé en C++, le langage de programmation étant complété avec le préprocesseur MOC (Meta-Object Compiler) qui apporte des fonctionnalités telles que le mécanisme élémentaire signaux/slots (permettant la communication déclenchée par un événement entre les objets du programme). Pour ce faire, le préprocesseur génère avant même la compilation un C++ conforme aux normes à partir du code source Qt. Par conséquent, les applications Qt peuvent être traduites avec des compilateurs C++ courants tels que GCC, ICC, MinGW ou MSVC. Les versions les plus récentes d’infrastructures offrent d’autre part un accès au langage de balisage QML propre à Qt qui apporte des simplifications en particulier dans le cadre du développement d’IGU. En dehors de ces solutions de langage internes, il prend en charge d’autres langages de programmation mis à dispositions par des prestataires tiers tels que Python, Ruby, Go, Java ou PHP.

Avec qmake (solution standard) et Qbs (Qt Build Suite), l’infrastructure offre deux systèmes de construction, sachant que d’autres systèmes tels que CMake peuvent également être utilisés. Par ailleurs, les utilisateurs ont à disposition l’environnement de développement intégré Qt Creator qui dispose notamment d’un éditeur de code et permet un accès rapide aux composants sélectionnés.

Aperçu des principaux composants Qt

Avec le temps, l’infrastructure de développement Qt est devenue toujours plus complète. Un travail intensif a été effectué sur la qualité de l’environnement de développement intégré Qt Creator ainsi que sur la prise en charge de langages et de plateformes mais également sur la mise à disposition d’une large palette de fonctionnalités aussi vaste que possible pour les programmeurs et designers. Ce faisant, l’équipe Qt met depuis toujours l’accent sur le fait de couvrir également des scénarios d’application spécifiques dans le segment informatique de bureau et le segment mobile.

Étant donné qu’uniquement un petit nombre d’applications fonctionnant sur la base de Qt dépendent de l’étendue complète des fonctionnalités, l’infrastructure est divisée en modules depuis la version 4. Ces modules peuvent être sélectionnés et assemblés librement ce qui offre une grande flexibilité dans le cadre du développement, aussi bien à l’équipe Qt qu’aux utilisateurs. Avec la version 5, l’équipe Qt a introduit une distinction supplémentaire dans les modules entre les modules de base (Essentiels Qt) d’un côté et les modules complémentaires pour des fins spécifiques (Extensions Qt) de l’autre.

Essentiels Qt

Les Essentiels Qt constituent la base de Qt, quelle que soit la plateforme. Ils sont disponibles sur toutes les plateformes de développement supportées ainsi que sur toutes les plateformes cibles testées et sont pertinents et utiles pour une grande partie des applications développées. Les modules suivants font partie des composants essentiels de l’infrastructure :

Modules Description
Qt Core Classes clés non graphiques utilisées par tous les autres modules
Qt GUI Classes de base pour la conception d’interfaces graphiques utilisateur ; comprend OpenGL
Qt Multimedia Ensemble de types QML et de classes C++ pour le traitement de contenus multimédias (audio/vidéo) ; IPA pour l’accès aux fonctionnalités de caméra et de radio
Qt Multimedia Widgets Classes basées sur les widgets pour l’implémentation de fonctionnalités multimédias
Qt Network IPA pour les applications accédant à des réseaux TCP/IP
Qt QML Infrastructure et types de langage de balisage Qt QML
Qt Quick Infrastructure déclarative pour le développement d’applications hautement dynamiques avec des interfaces utilisateur QML taillées sur mesure
Qt Quick Controls 2 Extension Qt Quick : types QML légers, très efficaces simplifiant la création d’interfaces
Qt Quick Dialogs Extension Qt Quick : types pour la création et l’interaction avec les dialogues système
Qt Quick Layouts Extension Qt Quick : types QML pour l’agencement d’objets dans l’interface développée
Qt Quick Test Infrastructure test pour les applications QML ; les cas de test sont décrits comme fonctionnalités JavaScript
Qt SQL Classes pour l’intégration de banques de données SQL
Qt Test Classes pour les tests détaillés des applications et les bibliothèques Qt
Qt Widgets Ensemble d’éléments d’IU permettant de créer des interfaces utilisateur classiques basées sur des widgets avec le Qt Designer

Comme indiqué, les modules utilisés dépendent de l’application. Les facteurs décisifs à cet égard sont tout d’abord les exigences auxquelles le projet concerné doit satisfaire. Dans certains cas, les outils avec lesquels vous souhaitez travailler sont également déterminants : les modules Qt Core et Qt GUI sont intégrés par défaut lorsque vous souhaitez travailler avec qmake. Si vous optez pour Qbs ou une autre solution en tant que système de construction, une telle dépendance prédéfinie n’existe pas.

Lors de la conception d’interfaces utilisateur graphiques, Qt offre également deux possibilités différentes impactant le choix des modules clés : d’une part, avec le Qt Designer, un éditeur WYSIWYG qui est étroitement lié aux widgets Qt est disponible. D’autre part, Qt Quick offre une alternative (comprenant différents modules complémentaires) permettant le développement du langage QML.

Extensions Qt

Tous les modules apportant une valeur ajoutée aux utilisateurs de Qt à des fins spécifiques sont marqués du label « extensions Qt ». Alors que certains de ces modules complémentaires sont, à l’instar des modules clés, conçus pour toutes les plateformes de développement et toutes les plateformes cibles supportées, une grande partie de ces composants est uniquement utilisable sur certaines plateformes. À titre d’exemple, l’extension Qt Bluetooth, qui permet l’accès au matériel Bluetooth, fonctionne uniquement dans des applications Android, iOS, Linux et macOS ; les modules tels que Qt Windows Extras, Qt Mac Extras ou Qt Android Extras fonctionnent uniquement dans les programmes pour les plateformes cibles correspondantes.

Par ailleurs, il existe trois extensions uniquement disponibles sous la licence commerciale ou la licence GNU-GPLv3 :

  • Qt Charts : composants d’IU pour l’affichage de diagrammes esthétiques visuellement (basés sur des modèles de données statiques ou dynamiques)
  • Qt Data Visualization : composants IU pour la visualisation 3D de données
  • Qt Virtual Keyboard : infrastructure pour l’implémentation de différentes méthodes de saisie ainsi que de claviers virtuels basés sur QML (plateformes cibles : Linux, Windows)
Note

Depuis Qt 5, il existe des modules complémentaires spécifiques (« Value-Add Modules ») qui sont disponibles exclusivement en cas d’utilisation d’une licence commerciale. Le module Qt for Automation qui contient différentes bibliothèques et différents outils pour le développement de systèmes d’automatisation tels que KNX (automatisation de bâtiment) en fait notamment partie.

Qt Creator

L’environnement de développement intégré (IDE) Qt Creator vous apporte de nombreux outils et mécanismes d’automatisation tout au long du processus de développement. Un gestionnaire de matériel aide par exemple à la création d’un nouveau projet en vous guidant pas à pas à travers les processus de création et en créant automatiquement toutes les données nécessaires. D'autre part, l’IDE accélère l’écriture du code. Pour cela, l’éditeur intégré offre notamment des fonctionnalités telles que la coloration syntaxique, la complétion automatique du code ou la vérification des erreurs.

Note

Les paquets binaires pour l’installation de Qt Creator (compris dans le téléchargement de Qt) sont disponibles pour les systèmes d’exploitation Windows (à partir de Windows 7), Ubuntu Linux (à partir de la version 16.04) et macOS (à partir de la version 10.10).

Les outils suivants sont de plus intégrés à l’éditeur par défaut dans Qt Creator :

  • qmake : qmake est intégré directement en tant que système de construction standard de Qt dans Qt Creator et peut être sélectionné dans le menu de projet. D’autres systèmes sont également exécutables dans l’IDE. Afin d’utiliser Qbs, il vous suffit par exemple d’ouvrir un fichier .qbs.
  • Qt Designer : le Qt Designer est le programme natif pour concevoir et créer des interfaces graphiques utilisateur à l’aide de widgets Qt. L’éditeur visuel permet d’assembler et d’adapter les widgets à volonté.
  • Qt Linguist : les applications peuvent être directement localisées dans Qt Creator. Les développeurs, traducteurs et gestionnaires de publication trouveront les outils appropriés à cette fin.
  • Qt Assistant : avec l’assistant Qt, le Qt Creator fournit un accès rapide à la documentation officielle de l’infrastructure. Une fonction d’aide est pour cela disponible.

Le développement du logiciel fonctionne avec des signaux et des slots dans Qt

Grâce à la connexion à Python, Ruby, Go, etc., Qt supporte en principe différents langages. Toutefois, le langage de programmation natif de l’infrastructure reste le C++ dans tous les cas, sachant que l’extension de ce langage orienté sur les objets apporte certains aspects et paradigmes nouveaux grâce au préprocesseur MOC tels que les signaux et slots déjà mentionnés. Le concept permet une communication déclenchée par un événement entre les composants de programmes utilisés et constitue une alternative flexible aux fonctionnalités de rappel directes (Callbacks). Il permet par exemple d’associer des objets ou des modules, sans que ceux-ci aient forcément à se connaître.

Note

Qt est l’initiateur du concept signaux/slots et a marqué considérablement le développement de ce concept au fil des ans. Aujourd’hui, bon nombre d’autres bibliothèques de programme et d'infrastructures, comme Flow, ont recours à ce modèle d’association.

Concrètement, le signal est un message qui envoie un objet dès qu’un événement survient. Concernant les slots, il s’agit d’une fonctionnalité habituelle qui peut être associée à un signal afin de toujours être exécutée par la suite lorsqu’elle reçoit le signal. Il est possible d’associer un signal avec plusieurs slots de telle sorte que plusieurs fonctionnalités peuvent être appelées comme résultat d’un événement unique. De même, le concept de programmation autorise l’association de plusieurs signaux avec un slot unique. Dans ce cas, une seule et même fonctionnalité est appelée lors de la survenance de différents événements.

Les signaux et les slots contribuent à apporter une fonctionnalité axée sur les événements dans les interfaces utilisateurs de l’application développée. Dans Qt, vous n’avez toutefois pas à créer laborieusement les associations signal/slot manuellement une à une : un grand nombre de classes fournies avec le framework offrent un accès à divers signaux et slots prédéfinis. En cas de besoin, il est toutefois possible de créer également vos propres associations d’objets.

Que permet le langage de balisage QML propre à Qt ?

Depuis la version 4.7, Qt est doté de son propre langage de balisage QML. Celui-ci se distingue notamment par le fait qu’il dispose d’une syntaxe similaire à JSON et supporte des expressions JavaScript impératives. Cependant, ce langage est avant tout marqué par la description déclarative des éléments des IGU qui fournit un code de programme clair. QML associe donc des approches déclaratives et impératives dans un même langage de programmation qui laisse au développeur une grande marge manœuvre. Si vous avez sélectionné le module Qt Quick, grâce au compilateur Qt Quick, vous disposez d’un outil adapté et prêt à l’emploi pour la compilation du code QML dans le C++ natif. Vous pouvez par ailleurs utiliser le designer du même nom (Qt Quick Designer) dans Qt Creator, afin de travailler avec des composants QML préétablis.

QML révèle en particulier ses points forts dans le cadre du développement d’IGU : en raison de la syntaxe considérablement plus simple et de la prise en charge de JavaScript, le langage permet aux designers un accès grandement amélioré au C++. Il est ainsi possible de créer sans difficulté des interfaces utilisateur codées en JSON par une exportation depuis Photoshop, ce qui accélère considérablement le processus de développement. Même si en théorie, il est possible de coder l’intégralité du programme en QML, le langage de balisage est plutôt rarement utilisé pour la programmation de la logique d’application.

Note

De bien des points de vue, le QML a rendu la création d’IU via les widgets superflue. Le langage de balisage dévoile notamment ses atouts lorsqu’il s’agit d’animations et de mises en page et composants de contrôle entièrement spécifiques à l’utilisateur (mobile, écran tactile, etc.). En revanche, s’il s’agit d’éléments de commande d’ordinateurs de bureau traditionnels tels que des barres de menu, des barres d’outils ou des composants glisser-déposer, les widgets offrent une meilleure prise en charge, ce qui explique pourquoi leur utilisation est encore très largement répandue dans les environnements d’ordinateurs de bureau classiques.

Sur quelles plateformes fonctionne Qt ?

Qt est pris en charge par différentes plateformes 32 et 64 bits. Pour utiliser le framework, GCC ou un autre compilateur est en règle générale suffisant. Pour utiliser Qt Quick, Open GL, DirectX ou un autre moteur de rendu est par ailleurs nécessaire. Pour la version actuelle de Qt, l’équipe de développeurs a dressé la liste de plateformes officiellement prises en charge suivante :

Plateforme Version Compilateur
Windows 10, 8.1, 7, UWP (Universal Windows Platform) MSVC 2017, MSVC 2015, MinGW 5.3
Linux/X11 openSUSE 42.2, Red Hat Enterprise Linux 6.6 et 7.2, Ubuntu 16.04 GCC (à partir de la version 4.8), ICC
Android à partir de la version 4.1 GCC, MinGW 5.3
macOS etc. macOS (à partir de la version 10.11), iOS 10 et 11, tvOS 10 et 11, watchOS 3 et 4 Clang (Apple)
Systèmes intégrés Embedded Linux, Embedded Linux (Boot2Qt), QNX 6.6.0 et 7.0, INTEGRITY 11.4.4 GCC

Dans quel cadre Qt est-il utilisé ?

Le plus gros projet de logiciel connu dans lequel l’infrastructure Qt est utilisée est probablement KDE Plasma (auparavant KDE Plasma Workspaces). Il s’agit ici d’une gamme d’environnements d’ordinateurs de bureau ou, depuis la version 5, d’un environnement flexible unique de la communauté open source KDE pour différents appareils (ordinateur fixe, Notebook, Netbook, tablette, smartphone). Ce faisant, les mises en page et les éléments de contrôle sont façonnés sur mesure pour les exigences des appareils concernés dans les différentes variantes d’ordinateurs de bureau grâce à Qt.

D’autres exemples marquants de logiciels fonctionnant sur la base de Qt montrent à quel point les scénarios d’application de l'infrastructure sont polyvalents :

Multimédia :

  • le programme de traitement des images Adobe Photoshop Elements
  • le programme de gestion des images Adobe Photoshop Album
  • le lecteur multimédia VLC Media Player
  • l’application Linux du service de musique en streaming Spotify

Communication :

  • l’édition Linux de l’outil de communication Skype
  • le service de messagerie instantanée Telegram
  • le logiciel de conférence vocale TeamSpeak

Partage de fichiers :

  • le client P2P Marabunta
  • le gestionnaire de téléchargement KDE KGet
  • le client BitTorrent Transmission

Outils graphiques 3D :

  • le logiciel de modélisation 3D Adobe Muse CC
  • le logiciel de virtualisation 3D Autodesk Maya
  • le logiciel CAD AutoQ3D

Jeux :

  • Monkey Island
  • Dust Racing 2D

Autres :

  • le programme de mise en page Scribus
  • le logiciel de mathématique Mathematica
  • le logiciel de notation et de composition Sibelius

En résumé : infrastructure flexible pour des projets multiplateformes polyvalents

Qt est une infrastructure vieille comme Hérode qui s’est constamment adaptée aux exigences des IGU modernes. Ce n’est pas un hasard si, plus de deux décennies après la sortie de la première version, cette collection d’outils codée en C++ fait également partie des solutions les plus appréciées pour le développement multiplateformes d’interfaces graphiques utilisateur. Cet engouement est notamment dû à des outils tels que le Qt Creator ou au langage de balisage QML implémenté dans les nouvelles versions qui optimisent non seulement le processus de travail en général mais simplifient également la collaboration entre les designers et les programmeurs.