Qt GUI主题看起来很老套

问题描述 投票:10回答:4

当我自己从源代码交叉编译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

c++ qt themes qt5 msys2
4个回答
7
投票

小工具

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

QApplication::setStyle("fusion");

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

  • “视窗”
  • “融合”
  • “WINDOWSXP”
  • “苹果”

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


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

Qt Quick

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

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


4
投票

如果你查看Qt 5.8.0中的src/widgets/configure.json文件,你可以看到它检查uxtheme.h的存在,并且uxtheme.h是编译windowsxp样式的前提条件,这是编译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包运行良好,因为我在他们的构建脚本中没有看到这样的补丁。


3
投票

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

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


0
投票

从静态Qt 5.6.3升级到静态5.12.0时,我遇到了同样的问题。我尝试用QApplication :: setStyle()手动设置“windowsvista”样式后解决了它,并注意到它在调试时返回null。事实证明在5.12.0中,windowsvista样式是它自己独立的插件,你需要链接插件/ styles / qwindowsvistastyle.lib并将Q_IMPORT_PLUGIN(QWindowsVistaStylePlugin)添加到包含你的main函数的cpp文件中。之后,无需手动设置样式,它会自动选择。

© www.soinside.com 2019 - 2024. All rights reserved.