Remplacez Qt par ImGui pour vos applications

  • By Anthony Rabine
  • 08 Mar, 2021
Remplacez Qt par ImGui pour vos applications

Après 20 ans de bons et loyaux services, j’ai demandé le divorce à Qt et je suis parti chercher si l’herbe est plus verte ailleurs. Elle l’est, dans certains cas, tout va dépendre ce que vous recherchez.

Constats sur Qt après 20 ans d’utilisation

Qt a été une révolution. Ce genre de petit pas pour le monde du logiciel qui a bénéficié à tant de sociétés et de logiciels libres.

Il y a 20 ans, il était enfin possible d’écrire des interfaces graphiques multi platformes (Windows/Mac/Linux) avec une même base de code. Que dire sur la qualité du code source ? Qt est un bonheur et un exemple de classes bien écrites et d’architecture logicielle. Simple. Oui simple. On ne veut pas de Boost quoi, c’est un enfer à templates. Et à l’époque, les compilateurs étaient très limités et bogués, notamment Visual C++ 6.0, et avoir une librairie templétisée multi-compilateur était une gageure.

Au fil des ans, j’ai aussi eu mon lot de mauvaises surprises. Sans prévenir, Qt rend obsolète des classes assez conséquentes, coucou QtScript et QGraphicsScene. Ok, les modules sont gardés et compilent toujours mais ne sont plus mis à jour ; c’est le bon côté d’avoir beaucoup de clients payants industriels qui obligent de fait Qt à pourvoir compiler du “vieux” code assez longtemps.

image Adieu, joli composant Qt

Dans ma pratique de Qt, j’ai évolué. Au début, j’utilisais TOUTES les classes que Qt proposait, surtout QString qui est assez fantastique il est vrai. Puis, ma vision de l’architecture logiciel s’est renforcée et j’ai privilégié une architecture MVC pour tous mes logiciels pour bénéficier dans avantages que l’on connaît. Mon but fut donc de n’utiliser Qt uniquement pour les interfaces graphiques et de faire le reste en C++.

Je fut aidé dans cette dernière pratique par l’évolution du standard C++ qui a pris un sacré élan fin des années 2000 avec la sortie du C++11. Beaucoup de classes utilitaires de Qt pouvaient être remplacées par du pur code C++.

Pour tout le reste, j’ai créé au fils des ans ma propre librairie C++ utilitaire pour combler ce qui manque encore dans le standard C++.

Enfin, Qt a selon moi évolué dans le mauvais sens :

  • Le QML, ok c’est sympa mais qu’est-ce que c’est lourd
  • Le débogage est un enfer à lancer dès que l’application est un peu conséquente, surtout avec le QML
  • La distribution d’un binaire Qt impose de livrer une demi-tonne d’âne mort de librairies style des DLL
  • … le tout basé sur un script qui fait un peu peur (Sous Windows)
  • La licence GPL, pour les applications non open-source
  • Les derniers changements de politique de gestion de la version GPL (plus de LTS…)
  • La lenteur de compilation
  • Les modules dépréciés (QtScript, QtQuick controls 1 …) et la non visibilité sur la stratégie technique

On comprend que Qt a besoin de faire rentrer des sous, mais leur tarif est également un sacré frein (surtout le coût des royalties) pour les petites entreprises.

Remplacer Qt, oui mais par quoi ?

Déjà, il faut distinguer deux choses :

  1. Tout ce qui n’est pas de l’interface graphique pour être remplacé :
  • Par du C++17 et plus
  • Par des librairies tierces
  • Écrivez des wrappers et du beau code pour éviter les inter-dépendances
  1. Pour l’interface graphique :
  • WxWidgets
  • Du HTML ? (via Electron par exemple)
  • Du OpenGL/Vulkan/Machin 3D

C’est cette dernière solution qui va nous intéresser. Sauf ordinateur antédiluvien, l’OpenGL est supportée partout et n’importe quel appareil qui est du type “mini-PC” au moins supporte de l’accélération 3D (je pense au Raspberry PI).

Si on jette un coup d’oeil du côté des jeux vidéo, développés souvent en OpenGL par exemple, on voit qu’il est possible de créer des interfaces vraiment évoluées : on retrouve tous les widgets classiques (checkbox, combobox, listview …) … donc : pourquoi pas créer des applications desktop ou Android de cette manière ?

image Les jeu vidéos peuvent proposer des UI jolies et évoluées !

Oui mais ce n’est pas si simple

Ok je sais, un GUI ou HUD de jeu n’est pas une application de bureau : il y a encore beaucoup de limitations dans les widgets. Créer de zéro un widget de type tableau excel avec filtres, drag and drop, classements… bon, à part si c’est son métier, il vaut mieux chercher des librairies existantes.

image Footbal Manager, le jeu-Excel

Sutout qu’une API 3D est brute de fonderie : elle offre des routines très bas niveau d’affichage à base de textures, proche de la carte graphique.

Heureusement, il y a des gars qui proposent des librairies plutôt assez évoluées. J’en ai trouvé deux qui respectent mes critères (licence, activité …).

image Nuklear, la personnalisation semble pouvoir être poussée assez loin

Nous avons Nukear d’un côté, et DearImGui de l’autre. J’ai choisi le deuxième, malgré le gros défaut d’être très difficilement modifiable graphiquement. On peut changer les couleurs, un peu l’aspect des widgets mais c’est tout. Heureusement, il semble que cela va s’arranger cette année.

image Dear ImGui

Dear ImGui, le principe

Les lettres IM dans le nom signifient Immediate Mode. Le paradigme utilisé est déroutant au premier abord quand on a développé aec des librairies graphiques plus classiques.

Avec Qt, vous instanciez une bonne fois pour toute vos éléments graphiques puis câblez divers événements pour détecter les changements ou mettre à jour l’interface. Avec le mode immédiat, vous rachaîchissez les éléments de l’interface en même temps que leur construction, dans une grosse boucle principale. Bon, je n’ai pas été voir comment cela était implémenté, mais je suppose qu’il y a des optimisations comme une réelle création des éléments uniquement lors du premier passage. D’ailleurs, chaque élément graphique est identifié par un nom unique, pour cet usage je suppose.

Dear ImGui : les add-ons

Au moment d’écrire cet article, l’auteur de la librairie maintien une branche un peu plus complète avec notamment l’ajout d’un système de docking de fenêtre particulièrement efficace et adapté au bureau.

À cela, s’ajoutent tout un tas d’extensions maintenues par la communautés. Voici une sélection de qualité :

image File chooser : https://github.com/dfranx/ImFileDialog

image ImPlot : https://github.com/epezent/implot

image ImNodes : https://github.com/Nelarius/imnodes

Alors, je quitte Qt ou pas ?

Réponse de Normand : ça dépend. Qt reste encore pratique, complet, puissant et versatile. Difficile de s’en passer pour certaines applications industrielles (interfaces tactiles par exemple, le support matériel et des classes surpuissantes). En tout cas, pour développer vite et bien, Qt est imbattable.

ImGui lui est sur la bonne pente : aidé par des ajouts communautaires, créer une application desktop est vraiment possible et va probablement remplacer Qt pour la plupart de mes futurs projets.