知识 | 将QML编译为C++:QtQuick Controls和可选导入发表时间:2022-09-20 16:20 原文作者:Qt公司高级软件工程师Ulf Hermann 本文是关于如何优化QML应用程序以充分利用qmlsc的系列博文的第六篇。在第一篇中,我们搭建了运行环境。为了便于理解后续文章,建议您先阅读第一篇。 这次我将展示如何处理由Qt自身模块提供的可选导入。在编译导入QtQuick.Controls的任何QML文件时,您将收到此类消息:
这还会间接导致如下的问题:
因为qmlsc不知道QtQuick.Controls的类型,也不知道它们能够提供锚点。这是一个ImageToolButton,派生自QtQuick.Controls提供的ToolButton。由于qmlsc不知道其分配绑定的属性类型,因此无法编译绑定值。 使用QML Profiler进行性能分析发现,anchors.verticalCenter的26次绑定赋值耗时54.2微秒,其中JavaScript执行耗时29.5微秒。 这条警告信息是什么意思呢?QtQuick.Controls在不同的平台上会使用不同的样式。在Windows上,它通常使用 "windows" 样式,在macOS上使用"macOS" 样式等。但是,您可以在运行时设置QT_QUICK_CONTROLS_STYLE环境变量,通过配置文件以及其他多种方式覆盖默认的样式。这意味着,在我们导入QtQuick.Controls时,qmlsc不知道它会提供什么类型。它可以是任何可用样式中的类型。 我们可以在编译时指定要使用的样式来解决这个问题。由于我们的Timeline模块几乎在任何地方都会使用QtQuick.Controls,因此最简单的方法就是从CMakeLists.txt中的模块定义中导入我们想要使用的特定样式。根据平台或我们可能需要的其他标准,在该处使用CMake选择不同的样式。我们将模块配置更改如下,并从各个QML文件中删除所有的QtQuick.Controls导入:
事实上,我们不能在Qt Creator上进行这样的修改,因为用户很重视他们对Qt Creator的样式风格的选择,无论他们使用的是什么桌面环境。如果您正在开发一个严格控制其样式风格的商业应用程序,而且可能会单独定制样式,那么您可能还是会希望在编译时修复该样式。在这种情况下,您还可以从将它的QML代码编译为C++的过程中获益。 应用此更改后,anchors.verticalCenter上的绑定值就可以编译为C++了。现在这26次调用耗时29微秒,其中13.7微秒用于JavaScript执行。与我们之前看到的54.1微秒和29.5微秒相比,这是一个相当显著的改进。 兼容性Qt 5.14及以上版本均支持模块级导入,但在Qt 6之前的版本中存在许多缺陷。首先,在Qt 5中您不能使用qt_add_qml_module()。因此,您必须手动编写qmldir文件,或者自己编写构建系统代码来生成它们。其次,Qt 5中的qmldir “import”指令只有在以下情况下才会合理地运行:
|