Une nouvelle version à support à long terme, la 6.5, du framework Qt a récemment été publiée. Elle introduit de nombreux correctifs, améliorations et nouvelles fonctionnalités par rapport à la version précédente. Certaines pourraient être utiles pour votre application (si ce n'est pas maintenant, probablement à l'avenir), il est donc judicieux de migrer votre application vers la dernière version du framework. 

Je sais que de nombreuses applications utilisent encore Qt 5, aussi une migration directe vers la dernière version du framework ne sera pas facile. Dans cet article, je souhaite mettre en évidence les étapes les plus critiques pour une migration fluide de Qt 5 vers Qt 6.

Qt 5 vs Qt 6 – migration ? Pourquoi ? 

Nous savons que Qt est l'une des meilleures technologies lorsqu'il s'agit dedéveloppement d'interface utilisateur et interfaces homme-machine. Vous pourriez dire que Qt 5 vous suffit amplement. Votre application fonctionne parfaitement bien et vous ne voyez aucun avantage à migrer. Vous pensez plutôt aux inconvénients, tels que les problèmes de compilation et d'exécution des applications ou les innombrables heures perdues. Je souhaite vous présenter les principaux avantages de Qt 6 et, plus loin dans cet article, vous montrer que la migration ne doit pas nécessairement être un voyage à travers l'enfer.

Alors, pourquoi Qt 6 ?

  1. Performances améliorées: Qt 6 introduit un nouveau pipeline de rendu qui améliore les performances et réduit la consommation de mémoire, ce qui se traduit par des applications plus rapides et plus réactives.
  2. QML amélioré: QML a été amélioré avec de meilleures performances, un support amélioré pour l'exportation de classes C++ vers QML et des outils plus puissants pour le débogage du code QML. Le nouveau Qt Quick Compiler permet de précompiler les fichiers QML pour des temps de démarrage plus rapides.
  3. Modules améliorés. Certains modules ont été réécrits et améliorés, par exemple Qt Quick 3D, Qt Multimedia et Qt WebEngine. L'utilisation de la dernière version de ces modules garantira que votre application est conforme aux normes actuelles.
  4. Modules complémentaires: De nombreux modules seront disponibles sous forme d'extensions. Cela réduira la taille du binaire Qt et vous permettra de télécharger le module uniquement lorsqu'il est nécessaire dans le projet.
  5. Backend unifié: Qt 6 fournit une API unique pour accéder aux fonctionnalités spécifiques à chaque plateforme dans plusieurs environnements. Cela inclut les graphiques, le multimédia, les entrées et les systèmes de fenêtrage.
  6. Support à long terme: Qt 5 a déjà atteint sa fin de vie, et bien que des correctifs de sécurité et de bugs soient encore disponibles pour certaines des versions plus anciennes, toute nouvelle fonctionnalité ou fonctionnalité ne sera disponible que dans Qt 6. Si vous ne voulez pas que votre application devienne obsolète trop rapidement, vous devriez entreprendre la migration.

Voici les principaux éléments qui garantiront que l'utilisation de la dernière version de Qt 6 maintiendra votre application à jour avec les fonctionnalités les plus récentes. Les performances de votre application seront meilleures qu'auparavant et sa maintenance future sera facilitée.

Chemin de migration vers Qt 6

Si vous commencez ce chapitre, cela signifie probablement que vous avez décidé de donner une chance à Qt 6. Je vais maintenant décrire les étapes à suivre pour rendre la migration aussi simple que possible.

Étape 1. Portage de Qt vers Qt 5.15 

Vous pourriez dire : « Pourquoi ? Je ne veux pas porter mon application vers Qt 5.15 ! Je veux la porter vers Qt 6 ». Vous avez raison, mais il est parfois plus facile de faire deux petits pas plutôt qu'un grand. Dans notre cas, porter l'application vers la dernière version de Qt 5 puis passer à Qt 6 est bien plus simple. En effet, Qt n'a publié les mécanismes facilitant la migration vers Qt 6 qu'à partir de la version 5.15. Quels sont ces mécanismes et comment les utiliser ? Cela est décrit à l'étape 4. La migration de la version précédente de Qt 5 vers la dernière version de Qt 5 devrait être simple.

Étape 2. Vérifier les modifications des modules 

Dans Qt 6, certains modules disponibles dans Qt 5 ne sont plus disponibles. Les modules sont supprimés, renommés ou fusionnés dans un module différent. Plusieurs des modules supprimés ont déjà été actualisés et ajoutés au framework dans les versions récentes.

En vérifiant les modifications des modules, vous pouvez vous assurer que votre application fonctionnera comme prévu après la migration. Les solutions possibles concernant le comportement à adopter lorsqu'un module n'existe plus peuvent varier. Voici quelques exemples de modules obsolètes et comment mettre à jour le code qui les utilise.

  • Qt Quick Controls 1 → Utilisez les nouveaux Qt Quick Controls 2
  • Qt Multimedia Widgets → Utiliser l'API QML de Qt Multimedia
  • Qt Graphical Effects → Utiliser le module Qt5Compat (Qt Quick MultiEffect depuis Qt 6.5)

Ainsi, comme vous pouvez le constater, vos actions dépendent du module que vous devez remplacer. La liste complète des modules supprimés et des autres modifications se trouve dansDocumentation Qt. 

« Dois-je vérifier les modifications dans chaque module de la documentation ? »

Non, vous n'êtes pas obligé. Cela peut vous aider à trouver le remplacement correct pour une API obsolète, mais les outils Qt peuvent vous informer sur toutes les parties de votre code qui ne sont plus prises en charge. Vous en saurez plus à ce sujet à l'étape 4.

Étape 3. Portage Qt : vérifiez votre environnement 

Qt 6 nécessite un compilateur C++17 ou supérieur (par exemple, pour Windows – MinGW 8.1.0 ou msvc 2019), donc si vous utilisez une version plus ancienne, il est temps de mettre à niveau. Les outils développés par Qt Company prennent également en charge Qt 6 à partir de versions spécifiques. Pour Qt Creator, il s'agit de la 4.14, et pour Qt Design Studio, de la 2.0.

Si le compilateur et les outils appropriés sont installés, l'application préparée pour Qt 6 devrait se compiler et s'exécuter correctement après le portage.

Étape 4. Effectuer le portage vers Qt 6 

Se débarrasser des fonctionnalités obsolètes. 

Dans Qt 5.15, tous les éléments qui ne seront pas inclus dans Qt 6 sont marqués comme obsolètes. Par défaut, l'utilisation de ce code génère un avertissement du compilateur. Mais vous avez la possibilité de le traiter comme une erreur.

Pour garantir cela, vous devez définir les QT_DISABLE_DEPRECATED_BEFORE. Il doit être défini sur0x050F00. Lorsque la macro est spécifiée, les fonctions obsolètes (dans une version donnée de Qt ou toute version antérieure) seront désactivées.

Si vous constatez des erreurs lors du build, vous devriez refactoriser cette partie.

//qmake project file DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x050F00 //CMakeLists.txt add_compile_definitions(QT_DISABLE_DEPRECATED_BEFORE=0x050F00) 
Sortie sans macro. L'application est correctement compilée.
Sortie avec macro. L'application ne peut pas être compilée.

Run clazy et se débarrasser de ces avertissements. 

Clazy est un outil d'analyse statique disponible sous forme de plugin dans QtCreator. Clazy peut analyser le code et vous montrer ce qui devrait être amélioré. Il est possible d'indiquer explicitement à Clazy ce qu'il doit vérifier lors de l'exécution. Il existe des options spéciales à vérifier qui peuvent pointer vers la partie du code non prise en charge dans Qt 6. Clazy est également capable de corriger lui-même ces avertissements, de sorte que la seule chose à faire est de lancer l'analyseur.

Options Clazy utiles lors du portage :

  • qt6-deprecated-api-fixes
  • qt6-header-fixes
  • qt6-qhash-signature
  • qt6-fwd-fixes
  • missing-qobject-macro
La configuration de Clazy peut être modifiée dans Preferences → Analyzer → Clang tools → Diagnostic configuration.
Options Clazy utiles lors du portage.
Exemple de sortie.

Utilisez le module Qt5Compat lorsque cela est nécessaire. 

À l'étape 2, j'ai mentionné un module appelé Qt5Compat. Qu'est-ce que c'est ?

Le module a été introduit pour vous aider dans la migration. Il fournit certaines des classes qui ont disparu dans Qt 6, par exemple QRegExp et QStringRef, mais grâce à cela, il peut toujours être utilisé dans les applications Qt 6. Par exemple, le module GraphicalEffects. Il n'est plus disponible dans Qt 6, mais si votre application utilise de nombreux effets, il sera difficile de migrer facilement sans aucune régression. C'est pourquoi Qt vous permet d'utiliser l'ancienne API.

Cela ne signifie pas pour autant que c'est la bonne approche. L'ancienne API devrait de toute façon être remplacée. Mais le module Qt5Compat vous donne le temps de trouver une alternative à tout ce qui est obsolète.

L'utilisation du module Qt Graphical Effects en est l'exemple parfait. Le module a disparu dans Qt 6 mais sera réintroduit sous le nom de MultiEffect dans l'une des prochaines versions. En attendant, nous pouvons utiliser le module Qt5Compat pour garantir la compatibilité. Mais lorsque le module MultiEffect sera disponible, le code devra être réécrit afin de supprimer l'API obsolète.

Comment importer le module dans votre projet :

//qmake project file QT += core5compat //CMakeLists.txt find_package(Qt6 REQUIRED COMPONENTS Core5Compat) target_link_libraries(mytarget PRIVATE Qt6::Core5Compat) 

La dernière chose à modifier est le changement des instructions d'importation dans le code C++ ou QML.

// Qt 5 #include <QtCore/QRegExp> // Qt 6 #include <QtCore5Compat/QRegExp> 

Étape 5. Tester l'application 

Le test de l'application doit être effectué en dernière étape. Vous devez réaliser des tests unitaires et vérifier le rendu visuel de l'application. Les applications QML dans Qt 6 utilisent un nouveau backend graphique, il est donc important d'effectuer les contrôles de régression dans le cadre de la migration. 

Bien sûr, la comparaison de tous les éléments visuels de l'application peut prendre du temps, il est donc recommandé d'automatiser ces tests. La capture d'écran de chaque vue de l'application peut être comparée pixel par pixel avec la dernière version générée, et vous pouvez être notifié en cas d'anomalie. 

Ne vous inquiétez pas si quelque chose semble différent après la migration. Vous avez toujours la possibilité d'utiliser manuellement les appels OpenGL (module Qt OpenGL) qui étaient utilisés par défaut dans Qt 5. 

Profitez du portage de Qt 

La migration de Qt 5 vers Qt 6 peut sembler intimidante, mais les étapes ci-dessus devraient faciliter le processus. Ces étapes comprennent la compréhension des changements et des nouvelles fonctionnalités de Qt 6, l'identification des problèmes de compatibilité potentiels, la refactorisation du code nécessaire, la mise à jour des outils et des systèmes de build, ainsi que des tests minutieux de l'application.

Migrer vers Qt 6 vaut vraiment le temps consacré. Qt 6 apporte de nombreuses améliorations et de nouvelles fonctionnalités indisponibles dans la version précédente. Cela rendra votre application plus facile à maintenir et à développer pour les années à venir.

Nous pouvons vous aider avec la migration. Consultez notre offre Qt pour plus d'informations.