QML 脚本编译器
QML 脚本编译器可将 QML 和 JavaScript 文件中的函数和表达式编译为可由 QML 引擎解释或即时编译的字节码。
此外,它还能将 QML 文件中的某些函数和表达式编译成 C++ 代码,但这要受 JavaScript 性质的限制。它会为可详尽分析的函数生成 C++ 代码。下面的流程图解释了编译工作流程。
QML 脚本编译器有两个版本。一个是qmlcachegen,它是. Qt Quick Compiler.另一个是qmlsc,它是Qt Quick Compiler Extensions 纯商业插件的一部分。
qmlcachegen
qmlcachegen使用 Meta-Object 系统,生成查询并将其存储在一个中心位置,即编译单元。编译单元包含文档结构表示法、每个函数和表达式的紧凑字节码表示法,以及编译器完全理解的函数和绑定的本地代码。QML 引擎可使用编译单元中的字节码,以避免重新编译并加快执行速度。
qmlsc
另一方面,qmlsc 通过提供两种额外模式,扩展了 qmlcachegen 的基本功能。
静态模式
在静态模式下,qmlsc 假定任何暴露给 C++ 的类型的属性都不会被派生类型阴影化。它消除了阴影检查机制,允许将更多 JavaScript 代码编译为 C++,并最终生成更快的代码。
要在 qmlsc 中启用静态模式,应通过QT_QMLCACHEGEN_ARGUMENTS
向qt_add_qml_module 传递--static
。
qt_add_qml_module(someTarget ... ) set_target_properties(someTarget PROPERTIES QT_QMLCACHEGEN_ARGUMENTS "--static" )
警告: 如果 QML 文档中的任何属性有阴影,qmlsc 静态模式会生成无效代码。
直接模式
在直接模式下,qmlsc 假定 QML 代码中使用的所有 C++ 类型都可用,并可作为 C++ 头文件包含到生成的代码中。然后,生成的代码通过直接调用这些头文件中的获取器、设置器和可调用函数来访问或修改属性,从而使执行速度更快。这意味着你必须在 CMake 中链接到私有的 Qt API。
警告: Qt 私有 API 经常变化。您需要为每个新版本重新编译 Qt。
警告: 如果一个类型只在插件中定义或没有头文件,你就不能在直接模式下使用它。
要启用直接模式,应考虑以下几点:
- 应通过
QT_QMLCACHEGEN_ARGUMENTS
将--direct-calls
传递给qt_add_qml_module。qt_add_qml_module(someTarget ... ) set_target_properties(someTarget PROPERTIES QT_QMLCACHEGEN_ARGUMENTS "--direct-calls" )
- 链接所有相关的私有 Qt 模块,而不是公有模块。
qt_add_qml_module(someTarget ... ) target_link_libraries(someTarget PRIVATE Qt::QmlPrivate Qt::QuickPrivate ... )
- 不要将
PLUGIN_TARGET
设置为与后备库目标相同。# direct mode will not function in this setup. qt_add_qml_module(someTarget PLUGIN_TARGET someTarget ... )
将 JavaScript 编译为 C++ 时的限制
许多 JavaScript 结构无法有效地用 C++ 表示。QML 脚本编译器会跳过包含此类结构的函数的 C++ 代码生成,只生成字节代码,以便通过即时编译器解释或运行。大多数常见的 QML 表达式都相当简单:QObjects 上的值查询、算术、简单的 if/else 或循环结构。这些都可以很容易地用 C++ 来表达,这样做会让你的应用程序运行得更快。
获取有关函数和绑定编译的统计数据
将 QML 编译成 C++ 时,QML 脚本编译器会记录统计数据。这些数据能让你了解函数和绑定的编译情况,以及编译是否成功或哪个错误导致了编译失败。除了按绑定或函数显示这些结果外,统计信息还按文件、模块和项目级别汇总。这样可以快速了解项目的编译情况。
要显示统计数据,请调用all_aotstatscmake target。
编译统计信息的收集默认是启用的。要禁用它,请在首次调用qt_add_qml_module 之前将QT_QML_GENERATE_AOTSTATS CMake 变量设为 OFF。
注意: 这些统计数据只适用于通过qt_add_qml_modulecmake API 注册的模块。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.