Qt GUI主题看起来很老套

时间:2017-06-27 15:36:22

标签: c++ qt themes qt5 msys2

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

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

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

交叉编译的Qt构建细节

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

MSYS2构建详细信息

我在MSYS2的MINGW64 shell中运行this script来构建示例并获得了良好的结果。它依赖于MSYS2的mingw-w64-x86_64-qt5-static软件包。您可以看到build recipe for that package

4 个答案:

答案 0 :(得分:6)

窗口小部件

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

QApplication::setStyle("fusion");

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

  • “窗口”
  • “融合”
  • “WindowsXP的”
  • 的 “Macintosh”

支持的主题取决于您的平台,可以使用插件进行扩展。

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

Qt Quick

如果您的GUI基于QtQuick而不是Widgets,则可以使用QQuickStyle::setStyle("Material");来自定义您想要使用的主题。

有关详细信息,请查看该文档页面:

答案 1 :(得分:4)

如果您查看Qt 5.8.0中的src/widgets/configure.json文件,您可以看到它检查是否存在uxtheme.huxtheme.h是编译windowsxp的前提条件{1}}样式,这是编译windowsvista样式的前提条件。通过查看Qt的config.log,我看到uxtheme.h测试失败了。我不知道为什么,但可能是因为uxtheme.h不能单独包括在内;您需要事先包含windows.h。我确认在配置Qt后查看windowsxp文件确实未启用windowsvistasrc/widgets/qtwidgets-config.pri样式。它有一个将要编译的样式列表,windowsvista不是列表。

我尝试将-style-windowsxp -style-windowsvista选项添加到Qt的configure命令中,但这些选项只会导致错误,因为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包运行良好,因为我在他们的构建脚本中没有看到这样的补丁。

答案 2 :(得分:0)

从静态Qt 5.6.3升级到静态5.12.0时,我遇到了同样的问题。我尝试通过QApplication :: setStyle()手动设置“ windowsvista”样式后发现问题,并在调试时返回了null。事实证明,在5.12.0中,windowsvista样式是其自己的单独插件,您需要链接plugins / styles / qwindowsvistastyle.lib并将Q_IMPORT_PLUGIN(QWindowsVistaStylePlugin)添加到包含主要功能的cpp文件中。之后,无需手动设置样式,它将自动选择。

答案 3 :(得分:0)

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

放置qwindowsvistastyle.dll(我发现它位于Qt \ 5.12.0 \ msvc2017_64 \ plugins \ styles中)需要放在我的applicationDir \ styles目录中。

相关问题