wake-up-neo.com

Qt GUI Theme sieht altmodisch aus

Wenn ich Qt 5.8.0 aus dem Quellcode selbst überquere und damit das Qt-Beispiel "Dynamische Layouts" aus Qt-Widgets für Microsoft Windows erstelle, sieht es altmodisch aus, als würde es unter Windows 2000 ausgeführt. wie im linken Fenster unten gezeigt. Wenn ich jedoch dasselbe Programm mit dem vorgefertigten Paket mingw-w64-x86_64-qt5-static (Version 5.8.0-1) aus MSYS2 kompiliere, sieht es aus wie in der Abbildung gezeigt im rechten Fenster unten. Wie kann ich meine Qt-Version so reparieren, dass die damit erstellten GUIs gut aussehen? Gibt es eine Konfigurationsoption, die mir fehlt?

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

Eine Sache, auf die man achten sollte, ist die Klasse QWindowsVistaStyle. Ich bemerkte, dass ich beim Kompilieren meines Programms in MSYS2 -luxtheme hinzufügen musste, da diese Klasse auf einige Funktionen von dort verwies, z. B. GetThemeColor. Diese Funktionen sind nur in Windows Vista und höher verfügbar. Als ich mit meinem eigenen Qt unter Linux cross-kompiliert habe, habe ich diese Bibliothek nicht benötigt. Vielleicht war diese Klasse in meinem Build also irgendwie deaktiviert.

Kreuzkompilierte Qt-Build-Details

Ich habe das cross-compilierte Qt und das alt aussehende Dynamic Layouts-Beispiel mit commit f51d834 aus meinem nixcrpkgs-Repository erstellt. Wenn Sie sich den Code in diesem Commit ansehen, sehen Sie genau, welche Befehle ausgeführt wurden, um den Cross-Compiler mingw-w64 zu erstellen, Qt zu erstellen und die Qt-Beispiele, einschließlich dynamischer Layouts, zu erstellen. Sie können es selbst erstellen, wenn Sie Nix installieren, nixcrkpkgs herunterladen und dann nix-build -A pkgs.i686-w64-mingw32.qt.base-examples im Verzeichnis nixcrpkgs ausführen. Sie können mein Build-Rezept für das Qt-Paket in diesem Commit sehen .

MSYS2-Build-Details

Ich habe dieses Skript in einer MINGW64-Shell in MSYS2 ausgeführt, um das Beispiel zu erstellen, und gute Ergebnisse erzielt. Es basiert auf dem Paket mingw-w64-x86_64-qt5-static von MSYS2. Sie können das Build-Rezept für dieses Paket sehen .

9
David Grayson

Wenn Sie in der Datei src/widgets/configure.json aus Qt 5.8.0 nachsehen, können Sie feststellen, dass uxtheme.h vorhanden ist und dass uxtheme.h eine Voraussetzung für das Kompilieren des Stils windowsxp ist. Dies ist eine Voraussetzung für das Kompilieren des Stils windowsvista. Ich habe in Qts config.log nachgesehen und festgestellt, dass der uxtheme.h-Test fehlgeschlagen ist. Ich bin mir nicht sicher, warum, aber es liegt wahrscheinlich daran, dass uxtheme.h nicht alleine eingefügt werden kann. Sie müssen vorher windows.h einbinden. Ich habe überprüft, dass die Stile windowsxp und windowsvista tatsächlich nicht aktiviert sind, indem ich nach der Konfiguration von Qt in der Datei src/widgets/qtwidgets-config.pri gesucht habe. Es enthält eine Liste der Stile, die kompiliert werden sollen, und windowsvista ist nicht die Liste.

Ich habe versucht, die -style-windowsxp -style-windowsvista -Optionen zum Qt-Befehl configure hinzuzufügen, aber diese Optionen verursachen nur Fehler, da der uxtheme.h-Test fehlschlägt und eine Voraussetzung für das Kompilieren dieser Themen ist.

Meine Lösung bestand darin, diesen Patch auf Qt 5.8.0 anzuwenden, um den Test uxtheme insgesamt zu überspringen:

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": {

Ich bin mir nicht sicher, warum das MSYS2-Paket gut funktioniert hat, da ich keinen solchen Patch in ihrem Build-Skript sehe.

4
David Grayson

Die Qt-Anwendung wählt automatisch das Standarddesign entsprechend Ihrem Betriebssystem aus. Wenn Sie sie überschreiben möchten, suchen Sie nach der Methode setStyle von QApplication, mit der Sie den für Ihre Anwendung verwendeten Stil definieren können, unabhängig davon, auf welchem ​​Betriebssystem sie ausgeführt werden.

QApplication::setStyle("fusion");

In der Dokumentation wird Folgendes unterstützt:

  • "windows"
  • "Verschmelzung"
  • "windowsxp"
  • "Macintosh"

BEARBEITEN: Diese Antwort zielt auf Situationen ab, in denen das Betriebssystem vom Qt-Konfigurationsschritt korrekt erkannt wird und Sie nur das verwendete Design ändern möchten. In der beschriebenen Situation wurde das falsche Thema ausgewählt, was in der OP-Antwort behoben ist.

6
Adrien Leravat

Ich hatte das gleiche Problem beim Upgrade von einem statischen Qt 5.6.3 auf statisches 5.12.0. Ich habe es gelöst, nachdem ich versucht habe, den "windowsvista" -Stil mit QApplication :: setStyle () manuell festzulegen, und festgestellt habe, dass er beim Debuggen null zurückgegeben hat. In Version 5.12.0 stellt sich heraus, dass der Windows Vista-Stil ein eigenes Plugin ist. Sie müssen eine Verknüpfung mit plugins/styles/qwindowsvistastyle.lib herstellen und Q_IMPORT_PLUGIN (QWindowsVistaStylePlugin) zur CPP-Datei mit Ihrer Hauptfunktion hinzufügen. Danach muss der Stil nicht mehr manuell eingestellt werden, sondern wird automatisch ausgewählt.

0
Steve Rogers

Ich hatte das gleiche Problem nach dem Upgrade von Qt5.9.1 auf Qt5.12.

Das Platzieren von qwindowsvistastyle.dll, das sich in Qt\5.12.0\msvc2017_64\plugins\styles befand, musste im Verzeichnis applicationDir\styles erfolgen.

0
Jonathan Owens