Qt GUI 主题看起来过时了
Posted
技术标签:
【中文标题】Qt GUI 主题看起来过时了【英文标题】:Qt GUI theme looks old-fashioned 【发布时间】:2017-11-30 18:01:59 【问题描述】:当我自己从源代码交叉编译 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 看起来不错?是否有我缺少的配置选项?
要研究的一件事是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。
【问题讨论】:
你需要一个清单文件:***.com/questions/37792366/… 我最终会尝试这个,但工作的 GUI 没有清单文件,所以我很怀疑。而且您链接的内容与主题或样式无关。 小部件样式在您构建 Qt 时是可选的。这意味着您可以选择要构建的样式和不构建的样式。此外,某些样式需要外部依赖项,如果您不提供此类依赖项,则可以从构建中省略它们。 Windows Vista 样式确实具有外部依赖项,并且可能已从您的构建中跳过。要检查哪些样式在运行时可用,您可以致电QStyleFactory::keys()
。
谢谢,我查看了 Qt 源文件,尤其是 src/widgets/configure.json
。 Windows Vista 和 XP 主题依赖于“uxtheme.h”。从我的 config.log 中,我可以看到 uxtheme.h 的测试失败,但没有说明原因。我可能需要在CFLAGS
中设置_WIN32_WINNT
或获取有关该测试失败原因的更多详细信息。
也许 Qt 自己绘制样式,而不是依赖那些 Windows DLL 来完成它。我通过正确配置 Qt 使事情正常进行;从来不需要清单。
【参考方案1】:
小部件
基于 Qt 的 GUI 将根据您的操作系统自动选择默认主题。如果你想覆盖它,你正在寻找 QApplication 的 setStyle
方法,它可以让你定义用于你的应用程序的样式,而不管它运行在什么操作系统上。
QApplication::setStyle("fusion");
根据文档,支持以下内容:
“窗口” “融合” “windowsxp” “Macintosh”支持的主题取决于您的平台,并且可以使用插件进行扩展。
编辑:此答案针对 Qt 配置步骤正确检测到操作系统的情况,并且您只想更改使用的主题。在所描述的情况下,选择了不正确的主题,这已在 OP 的答案中得到修复。
Qt 快速
如果您的 GUI 是基于 QtQuick 而不是 Widgets,您可以改用QQuickStyle::setStyle("Material");
来自定义您希望看到使用的主题。
有关更多详细信息,您可以查看该文档页面:
https://doc.qt.io/qt-5/qtquickcontrols2-styles.html#using-styles-in-qt-quick-controls-2【讨论】:
我最终会尝试这个,但我很怀疑,因为工作的 GUI 没有调用setStyle
。工作的 GUI 使用了与丑陋的 GUI 完全相同的代码。并且两个 GUI 看起来都像“窗口”。
如果我没记错的话,你显示的左图是默认的旧 linux 样式,所以应用“windows”样式应该可以解决这个问题,通过强制使用主题,而不是让 Qt 推断它。跨度>
当Qt构建好后,可以推断出正确的主题来使用;在为 Windows 编译时,无需强制它使用 Windows。
那是正确的,我将修改我的答案以添加该一般信息。赞成您的最后一个答案,很好地解决了问题!【参考方案2】:
从 Qt5.9.1 升级到 Qt5.12 后,我遇到了同样的问题。
放置qwindowsvistastyle.dll,我发现在Qt\5.12.0\msvc2017_64\plugins\styles,需要放在我的applicationDir\styles目录下。
【讨论】:
非常感谢!如此简单的解决方案!竖起大拇指! 对于那些使用 CMake 的人,你需要这样的东西:install(PROGRAMS "$<TARGET_FILE:Qt5::QWindowsIntegrationPlugin>" DESTINATION platforms )
和 install(PROGRAMS "$<TARGET_FILE:Qt5::QWindowsVistaStylePlugin>" DESTINATION styles )
【参考方案3】:
从静态 Qt 5.6.3 升级到静态 5.12.0 时,我遇到了同样的问题。我尝试使用 QApplication::setStyle() 手动设置“windowsvista”样式后解决了这个问题,并注意到它在调试时返回了 null。事实证明,在 5.12.0 中,windowsvista 样式是它自己的单独插件,您需要链接到 plugins/styles/qwindowsvistastyle.lib 并将 Q_IMPORT_PLUGIN(QWindowsVistaStylePlugin) 添加到包含您的主要功能的 cpp 文件中。之后就不需要手动设置样式了,会自动选择的。
【讨论】:
【参考方案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 后查看 src/widgets/qtwidgets-config.pri
文件验证了 windowsxp
和 windowsvista
样式确实没有启用。它有一个要编译的样式列表,windowsvista
不是列表。
我尝试在 Qt 的配置命令中添加 -style-windowsxp -style-windowsvista
选项,但这些选项只会导致错误,因为 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 包运行良好,因为我在他们的构建脚本中没有看到任何类似的补丁。
【讨论】:
以上是关于Qt GUI 主题看起来过时了的主要内容,如果未能解决你的问题,请参考以下文章