当我自己从源代码交叉编译 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 看起来不错?是否有我缺少的配置选项?
要研究的一件事是 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 许可协议
如果您查看来自 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
不是列表。我尝试将
-style-windowsxp -style-windowsvista
选项添加到 Qt 的配置命令中,但这些选项只会导致错误,因为uxtheme.h
测试失败,这是编译这些主题的先决条件。我的解决方案是将此补丁应用到 Qt 5.8.0 以完全跳过
uxtheme
测试:我不确定为什么 MSYS2 包运行良好,因为我在他们的构建脚本中没有看到任何这样的补丁。