本页内容

QML 脚本编译器

QML 脚本编译器将 QML 和 JavaScript 文件中的函数和表达式编译为字节码,该字节码可由 QML 引擎进行解释或即时编译。

此外,在 JavaScript 本质所设定的限制范围内,它还将 QML 文件中的某些函数和表达式编译为 C++ 代码。对于能够被彻底分析的函数,它会生成相应的 C++ 代码。下图的流程图说明了编译的工作流程。

流程图展示了编译方案

QML 脚本编译器有两个版本。一个是qmlcachegen,它是 Qt Quick Compiler。另一个是qmlsc,它是仅限商业使用的附加组件“Qt Quick Compiler 扩展”的一部分。

qmlcachegen

qmlcachegen利用元对象系统生成查找操作,并将它们存储在一个中央位置——即编译单元中。该编译单元包含文档结构的表示、每个函数和表达式的紧凑字节码表示,以及编译器完全理解的函数和绑定的原生代码。 QML 引擎可以利用编译单元中的字节码来避免重新编译并加快执行速度。

qmlsc

另一方面,qmlsc 通过提供两种额外模式,扩展了 qmlcachegen 的基本功能。

静态模式

在静态模式下,qmlsc 假定任何暴露给 C++ 的属性都不会被派生类型遮蔽。它消除了遮蔽检查机制,允许将更多的 JavaScript 代码编译为 C++,最终生成更快的代码。

要在 qmlsc 中启用静态模式,应通过 `QT_QMLCACHEGEN_ARGUMENTS ` 将 `--static ` 传递给 `qt_add_qml_module`。

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 模块,而不是其公有版本。
    find_package(Qt6 COMPONENTS QmlPrivate QuickPrivate)
    
    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++ 代码生成,仅生成字节码以供解释或通过即时编译器(JIT)运行。 大多数常见的 QML 表达式都比较简单:对 QObject 的值查找、算术运算、简单的 if/else 或循环结构。这些都可以轻松地用 C++ 表达,这样做会使您的应用程序运行得更快。

获取函数和绑定编译的统计信息

QML 脚本编译器在将 QML 编译为 C++ 时会记录统计信息。这些信息有助于深入了解函数和绑定的编译情况,包括编译所耗时间、编译是否成功,以及若失败则由何种错误导致。 除了按绑定或函数显示这些结果外,统计数据还会按文件、模块以及项目级别进行汇总。这可以快速了解项目编译的整体情况。

要显示统计信息,请调用all_aotstatsCMake 目标。

编译统计信息的收集功能默认处于启用状态。若要禁用该功能,请在首次调用qt_add_qml_module 之前,将 CMake 变量QT_QML_GENERATE_AOTSTATS设置为 OFF。

注意:这些 统计信息仅适用于通过qt_add_qml_moduleCMake API 注册的模块

© 2026 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.