Qt GUI主题看起来很老套

Dav*_*son 14 c++ qt themes qt5 msys2

当我自己从源代码交叉编译Qt 5.8.0并使用它来构建Qt Widgets for Microsoft Windows 的Qt"动态布局"示例时,它看起来过时了,好像它在Windows 2000上运行一样,如图所示左下方的窗口.不过,如果我使用预建的MinGW-W64-x86_64的-QT5静电包装从编译完全相同的程序(5.8.0-1版)MSYS2,它看起来像一个漂亮现代的Windows应用程序,如在右边的窗口下面.如何修复我的Qt版本,以便用它构建的GUI看起来不错?是否有我缺少的配置选项?

左:我编译的Qt. 右:Qt由MSYS2项目编译

要研究的是QWindowsVistaStyle课程.我注意到当我在MSYS2中编译我的程序时,我不得不添加,-luxtheme因为该类引用了一些函数,比如GetThemeColor.这些功能仅适用于Windows Vista及更高版本.当我在Linux上使用我自己的Qt进行交叉编译时,我不需要那个库,所以也许这个类在我的构建中被禁用了.

交叉编译的Qt构建细节

我使用我的nixcrpkgs存储库的commit f51d834构建了交叉编译的Qt和看起来很旧的动态布局示例.如果查看该提交中的代码,它将向您显示运行构建mingw-w64交叉编译器的命令,并构建Qt,并构建Qt示例,包括动态布局.如果您安装Nix,下载nixcrkpkgs,然后nix-build -A pkgs.i686-w64-mingw32.qt.base-examples在nixcrpkgs目录中运行,您可以自己构建它.您可以在该提交中查看我的Qt包的构建配方.

MSYS2构建细节

我在MSYS2中的MINGW64 shell中运行此脚本来构建示例并获得了良好的结果.它依赖于MSYS2的mingw-w64-x86_64-qt5-static软件包.您可以看到该构建配方.

Adr*_*vat 7

Qt应用程序将根据您的操作系统自动选择默认主题.如果要覆盖它们,那么您正在寻找QApplication的setStyle方法,该方法允许您定义用于应用程序的样式,而不管运行的是什么操作系统.

QApplication::setStyle("fusion");
Run Code Online (Sandbox Code Playgroud)

从文档中,支持以下内容:

  • "视窗"
  • "融合"
  • "WindowsXP的"
  • "苹果"

编辑:此答案针对Qt配置步骤正确检测操作系统的情况,您只想更改使用的主题.在所描述的情况下,选择了不正确的主题,这在OP答案中得到修复.


小智 7

从Qt5.9.1升级到Qt5.12后,我遇到了同样的问题。

将放置在我发现位于Qt \ 5.12.0 \ msvc2017_64 \ plugins \ styles中的qwindowsvistastyle.dll放置在applicationDir \ styles目录中。

  • 非常感谢!如此简单的解决方案!竖起大拇指! (2认同)
  • 对于使用 CMake 的用户,您将需要如下所示的内容: `install(PROGRAMS "$<TARGET_FILE:Qt5::QWindowsIntegrationPlugin>" DESTINATION versions )` 和 `install(PROGRAMS "$<TARGET_FILE:Qt5::QWindowsVistaStylePlugin>" DESTINATION 样式)` (2认同)

Dav*_*son 5

如果查看src/widgets/configure.jsonQt 5.8.0的文件,可以看到它检查是否存在uxtheme.h,这uxtheme.h是编译windowsxp样式的前提条件,这是编译windowsvista样式的前提条件。通过查看 Qt 的config.log,我看到uxtheme.h测试失败了。我不确定为什么,但可能是因为uxtheme.h不能单独包含;你需要windows.h事先包括在内。我在配置 Qt 后通过查看文件验证了确实没有启用windowsxpwindowsvista样式src/widgets/qtwidgets-config.pri。它有一个将被编译的样式列表,而windowsvista不是列表。

我尝试将-style-windowsxp -style-windowsvista选项添加到 Qt 的配置命令中,但这些选项只会导致错误,因为uxtheme.h测试失败并且它是编译这些主题的先决条件。

我的解决方案是将此补丁应用于 Qt 5.8.0 以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": {
Run Code Online (Sandbox Code Playgroud)

我不确定为什么 MSYS2 包运行良好,因为我在他们的构建脚本中没有看到任何这样的补丁。