Qt GUI 主题看起来过时了

新手上路,请多包涵

当我自己从源代码交叉编译 Qt 5.8.0 并使用它从 Qt Widgets for Microsoft Windows 构建 Qt“动态布局”示例时,它看起来很老式,就好像它在 Windows 2000 上运行一样,如图所示下面的左窗口。但是,如果我使用来自 MSYS2 的预构建 mingw-w64-x86_64-qt5-static 包(版本 5.8.0-1)编译完全相同的程序,它看起来就像一个不错的现代 Windows 应用程序,如右窗口所示以下。如何修复我的 Qt 版本,以便用它构建的 GUI 看起来不错?是否有我缺少的配置选项?

左:我编译的 Qt。右:MSYS2项目编译的Qt

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

交叉编译的 Qt 构建细节

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

MSYS2 构建细节

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

原文由 David Grayson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 643
2 个回答

如果您查看来自 Qt 5.8.0 的 src/widgets/configure.json 文件,您可以看到它检查是否存在 uxtheme.h ,并且 uxtheme.h 的前提条件是 —编译 windowsxp 风格,这是编译 windowsvista 风格的前提。通过查看 Qt 的 config.log ,我看到 uxtheme.h 测试失败。我不知道为什么,但可能是因为 uxtheme.h 不能单独包含;您需要事先包含 windows.h 。我通过在配置 Qt 后查看 src/widgets/qtwidgets-config.pri 文件验证了 windowsxpwindowsvista 样式确实没有启用。它有一个要编译的样式列表,而 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": {

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

原文由 David Grayson 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

放置qwindowsvistastyle.dll,我发现在Qt\5.12.0\msvc2017_64\plugins\styles,需要放在我的applicationDir\styles目录下。

原文由 Jonathan Owens 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏