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看起来不错?是否有我缺少的配置选项?
要研究的是QWindowsVistaStyle课程.我注意到当我在MSYS2中编译我的程序时,我不得不添加,-luxtheme因为该类引用了一些函数,比如GetThemeColor.这些功能仅适用于Windows Vista及更高版本.当我在Linux上使用我自己的Qt进行交叉编译时,我不需要那个库,所以也许这个类在我的构建中被禁用了.
我使用我的nixcrpkgs存储库的commit f51d834构建了交叉编译的Qt和看起来很旧的动态布局示例.如果查看该提交中的代码,它将向您显示运行构建mingw-w64交叉编译器的命令,并构建Qt,并构建Qt示例,包括动态布局.如果您安装Nix,下载nixcrkpkgs,然后nix-build -A pkgs.i686-w64-mingw32.qt.base-examples在nixcrpkgs目录中运行,您可以自己构建它.您可以在该提交中查看我的Qt包的构建配方.
我在MSYS2中的MINGW64 shell中运行此脚本来构建示例并获得了良好的结果.它依赖于MSYS2的mingw-w64-x86_64-qt5-static软件包.您可以看到该包的构建配方.
Qt应用程序将根据您的操作系统自动选择默认主题.如果要覆盖它们,那么您正在寻找QApplication的setStyle方法,该方法允许您定义用于应用程序的样式,而不管运行的是什么操作系统.
QApplication::setStyle("fusion");
Run Code Online (Sandbox Code Playgroud)
从文档中,支持以下内容:
编辑:此答案针对Qt配置步骤正确检测操作系统的情况,您只想更改使用的主题.在所描述的情况下,选择了不正确的主题,这在OP答案中得到修复.
小智 7
从Qt5.9.1升级到Qt5.12后,我遇到了同样的问题。
将放置在我发现位于Qt \ 5.12.0 \ msvc2017_64 \ plugins \ styles中的qwindowsvistastyle.dll放置在applicationDir \ styles目录中。
如果查看src/widgets/configure.jsonQt 5.8.0的文件,可以看到它检查是否存在uxtheme.h,这uxtheme.h是编译windowsxp样式的前提条件,这是编译windowsvista样式的前提条件。通过查看 Qt 的config.log,我看到uxtheme.h测试失败了。我不确定为什么,但可能是因为uxtheme.h不能单独包含;你需要windows.h事先包括在内。我在配置 Qt 后通过查看文件验证了确实没有启用windowsxp和windowsvista样式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 包运行良好,因为我在他们的构建脚本中没有看到任何这样的补丁。