web-dev-qa-db-fra.com

Le thème de l'interface graphique de Qt semble démodé

Lorsque je compile Qt 5.8.0 à partir de la source moi-même et que je l'utilise pour créer l'exemple Qt "Dynamic Layouts" à partir de Qt Widgets pour Microsoft Windows, il semble démodé, comme s'il fonctionnait sur Windows 2000, comme indiqué dans la fenêtre de gauche ci-dessous. Cependant, si je compile exactement le même programme en utilisant le package mingw-w64-x86_64-qt5-static pré-construit (version 5.8.0-1) de MSYS2 , cela ressemble à une belle application Windows moderne , comme indiqué dans la fenêtre de droite ci-dessous. Comment puis-je réparer ma version de Qt pour que les interfaces graphiques construites avec lui soient belles? Y a-t-il une option de configuration qui me manque?

Left: Qt compiled by me. Right: Qt compiled by MSYS2 project

Une chose à examiner est la classe QWindowsVistaStyle. J'ai remarqué que lorsque j'ai compilé mon programme dans MSYS2, j'ai dû ajouter -luxtheme parce que cette classe faisait référence à certaines fonctions à partir de là, comme GetThemeColor. Ces fonctions ne sont disponibles que dans Windows Vista et versions ultérieures. Lorsque j'ai compilé de manière croisée en utilisant mon propre Qt sous Linux, je n'avais pas besoin de cette bibliothèque, donc peut-être que cette classe a été désactivée dans ma version.

Détails de la construction de Qt compilés de manière croisée

J'ai construit Qt compilé de manière croisée et l'exemple de dispositions dynamiques à l'ancienne en utilisant commit f51d834 de mon référentiel nixcrpkgs. Si vous regardez le code dans ce commit, il vous montrera exactement quelles commandes ont été exécutées pour construire le compilateur croisé mingw-w64, et construire Qt, et construire les exemples Qt, y compris les dispositions dynamiques. Vous pouvez le créer vous-même si vous installez Nix , téléchargez nixcrkpkgs , puis exécutez nix-build -A pkgs.i686-w64-mingw32.qt.base-examples dans le répertoire nixcrpkgs. Vous pouvez voir ma recette de build pour le paquet Qt dans ce commit .

Détails de la construction MSYS2

J'ai exécuté ce script dans un shell MINGW64 dans MSYS2 pour construire l'exemple et obtenir de bons résultats. Il s'appuie sur le package mingw-w64-x86_64-qt5-static de MSYS2. Vous pouvez voir le recette de construction pour ce paquet .

17
David Grayson

Si vous regardez dans le fichier src/widgets/configure.json De Qt 5.8.0, vous pouvez voir qu'il vérifie l'existence de uxtheme.h Et que uxtheme.h Est une condition préalable pour compiler le windowsxp style, qui est une condition préalable à la compilation du style windowsvista. En regardant dans config.log De Qt, j'ai vu que le test uxtheme.h A échoué. Je ne sais pas pourquoi, mais c'est probablement parce que uxtheme.h Ne peut pas être inclus seul; vous devez inclure windows.h au préalable. J'ai vérifié que les styles windowsxp et windowsvista n'étaient en effet pas activés en regardant dans le fichier src/widgets/qtwidgets-config.pri Après avoir configuré Qt. Il a une liste de styles qui vont être compilés et windowsvista n'est pas la liste.

J'ai essayé d'ajouter les options -style-windowsxp -style-windowsvista À la commande configure de Qt, mais ces options ne font que provoquer des erreurs car le test uxtheme.h Échoue et c'est une condition préalable à la compilation de ces thèmes.

Ma solution a été d'appliquer ce patch à Qt 5.8.0 pour ignorer complètement le test uxtheme:

diff -ur qt58-orig/src/widgets/configure.json qt58/src/widgets/configure.json
--- qt58-orig/src/widgets/configure.json        2017-05-28 02:07:07.625626151 -0700
+++ qt58/src/widgets/configure.json     2017-06-27 21:25:52.752628339 -0700
@@ -28,11 +28,6 @@
     },

     "tests": {
-        "uxtheme": {
-            "label": "uxtheme.h",
-            "type": "files",
-            "files": [ "uxtheme.h" ]
-        }
     },

     "features": {
@@ -57,7 +52,7 @@
         },
         "style-windowsxp": {
             "label": "WindowsXP",
-            "condition": "features.style-windows && config.win32 && !config.winrt && tests.uxtheme",
+            "condition": "features.style-windows && config.win32 && !config.winrt",
             "output": [ "styles" ]
         },
         "style-windowsvista": {

Je ne sais pas pourquoi le package MSYS2 a bien fonctionné, car je ne vois aucun correctif comme celui-ci dans leur script de construction.

4
David Grayson

J'ai eu le même problème après la mise à niveau de Qt5.9.1 vers Qt5.12.

Placer qwindowsvistastyle.dll, que j'ai trouvé dans Qt\5.12.0\msvc2017_64\plugins\styles, devait être placé dans mon répertoire applicationDir\styles.

11
Jonathan Owens

Widgets

Les interfaces graphiques basées sur Qt sélectionneront automatiquement le thème par défaut en fonction de votre système d'exploitation. Si vous souhaitez la remplacer, vous recherchez la méthode setStyle de QApplication, qui vous permet de définir le style utilisé pour votre application, quel que soit le système d'exploitation sur lequel elle s'exécute.

QApplication::setStyle("fusion");

Dans la documentation, les éléments suivants sont pris en charge:

  • "les fenêtres"
  • "la fusion"
  • "Windows XP"
  • "Macintosh"

Les thèmes pris en charge dépendent de votre plateforme et peuvent être étendus avec des plugins.


EDIT: Cette réponse cible les situations où le système d'exploitation est correctement détecté par l'étape de configuration de Qt, et vous souhaitez simplement changer le thème utilisé. Dans la situation décrite, le thème incorrect a été sélectionné, ce qui est corrigé dans la réponse de OP.

Qt Quick

Si votre interface graphique est basée sur QtQuick au lieu de Widgets, vous pouvez utiliser QQuickStyle::setStyle("Material"); à la place pour personnaliser le thème que vous souhaitez voir utilisé.

Pour plus de détails, vous pouvez consulter cette page de documentation:

8
Adrien Leravat

J'ai eu ce même problème lors de la mise à niveau d'un Qt 5.6.3 statique vers un 5.12.0 statique. Je l'ai résolu après avoir essayé de définir manuellement le style "windowsvista" avec QApplication :: setStyle () et j'ai remarqué qu'il retournait null lors du débogage. Il s'avère qu'en 5.12.0 le style windowsvista est son propre plugin séparé et vous devez vous lier à plugins/styles/qwindowsvistastyle.lib et ajouter Q_IMPORT_PLUGIN (QWindowsVistaStylePlugin) au fichier cpp contenant votre fonction principale. Après cela, il n'est pas nécessaire de définir manuellement le style, il est choisi automatiquement.

2
Steve Rogers