【发布时间】: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。
【问题讨论】:
-
你需要一个清单文件:stackoverflow.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 使事情正常进行;从来不需要清单。