概述 - QML 与 C++ 的集成

QML 在设计上可通过 C++ 代码轻松扩展。模块中的类 Qt Qml模块中的类使 QML 对象能从 C++ 加载和操作,QML 引擎与 Qt对象系统集成的特性使 C++ 功能能直接从 QML 调用。这就允许开发混合应用程序,这些应用程序由 QML、JavaScript 和 C++ 代码混合实现。

QML 与 C++ 的集成提供了各种机会,包括以下能力

  • 通过在 QML文档中使用 QML 和 JavaScript 实现前者,使用 C++ 实现后者,从而将用户界面代码与应用程序逻辑代码分开
  • 从 QML 使用和调用某些 C++ 功能(例如,调用您的应用逻辑、使用 C++ 实现的数据模型或调用第三方 C++ 库中的某些函数)
  • 访问 Qt QmlQt QuickC++ API 中的功能(例如,使用QQuickImageProvider 动态生成图像)。
  • 用 C++ 实现您自己的QML 对象类型--无论是在您自己的特定应用程序中使用,还是发布给他人

要为 QML 提供一些 C++ 数据或功能,必须从QObject 派生的类中提供。如Exposing Attributes of C++ Types to QML 所述,由于 QML 引擎与元对象系统集成,任何QObject 衍生类的属性、方法和信号都可从 QML 访问。一旦这样的类提供了所需的功能,它就能以各种方式暴露给 QML:

这些是从 QML 代码访问 C++ 功能的最常用方法;如需更多选项和详情,请参阅下面各节描述的主要文档页面。此外,除了从 QML 访问 C++ 功能外,模块还提供了反向操作方法。 Qt Qml模块还提供了反向操作的方法,从 C++ 代码中操作 QML 对象。详见从 C++ 与 QML 对象交互

将某些状态作为全局属性公开给 QML 通常是可取的。从 C++ 向 QML 公开状态(Exposing State from C++ to QML)描述了如何做到这一点。

最后,C++ 代码可集成到 C++ 应用程序或 C++ 插件中,这取决于它是作为独立应用程序还是库发布。插件可与 QML 模块集成,然后 QML 代码可在其他应用程序中导入和使用;更多信息,请参阅在C++ 插件中提供类型和功能

在 C++ 和 QML 之间选择正确的集成方法

要快速确定哪种集成方法适合您的情况,可使用下面的流程图:

有关流程图中宏的描述,请参阅从 C++ 定义 QML 类型文档。

把 C++ 类的属性公开给 QML

由于 QML 引擎与 Qt Qml 元对象系统的集成,QML 可以很容易地从 C++ 扩展。这种集成允许从 QML 访问任何QObject 衍生类的属性、方法和信号:属性可被读取和修改,方法可从 JavaScript 表达式调用,信号处理器会根据需要自动创建。此外,QObject 派生类的枚举值可从 QML 访问。

更多信息,请参阅将 C++ 类型的属性公开给 QML

从 C++ 定义 QML 类型

QML 类型可在 C++ 中定义,然后在QML 类型系统中注册。这允许 C++ 类实例化为QML 对象类型,使自定义对象类型能用 C++ 实现,并集成到现有的 QML 代码中。C++ 类也可为其它目的注册:例如,它可注册为单例类型(Singleton Type),使 QML 代码能导入单个类实例,或注册为枚举类型(enumeration values),使 QML 能访问非实例类的枚举值。

此外,该 Qt Qml模块提供了定义 QML 类型的机制,可与 QML 概念(如附加属性和默认属性)集成。

有关从 C++ 注册和创建自定义 QML 类型的更多信息,请参阅Defining QML Types from C++文档。

用上下文属性把 C++ 对象嵌入 QML

使用上下文属性context properties)和上下文对象contextobjects),可将 C++ 对象和值直接嵌入已加载 QML 对象的上下文(或范围)中。这是通过QQmlContext 类实现的。 Qt Qml模块提供的类实现,该类将数据暴露给 QML 组件的上下文,允许将数据从 C++ 注入 QML。

更多信息,请参阅《使用上下文属性将 C++ 对象嵌入 QML》(Embedding C++ Objects into QML with Context Properties)。

从 C++ 与 QML 对象交互

QML 对象类型可从 C++ 实例化并检查,以访问它们的属性、调用它们的方法和接收它们的信号通知。之所以能做到这一点,是因为所有 QML 对象类型都是使用QObject-derived classes 实现的,使 QML 引擎能通过 Qt Qml 元对象系统动态加载和内省对象。

警告: 虽然可以从 C++ 访问 QML 对象并对其进行操作,但除了测试和原型设计目的外,不推荐使用这种方法。QML 和 C++ 集成的优势之一是能在 QML 中实现与 C++ 逻辑和数据集后端分离的用户界面,如果 C++ 端开始直接操作 QML,就会失败。如果 C++ 方面开始直接操作 QML,这种方法就会失效。这种方法也会使更改 QML 用户界面而不影响其 C++ 对应部分变得困难。

有关从 C++ 访问 QML 对象的更多信息,请参阅《从 C++ 与 QML 对象交互》(Interacting with QML Objects from C++)文档,以及最佳实践(Best Practices)页面的《 C++ 向 QML 公开数据》(Exposing Data from C++ to QML)部分。

QML 和 C++ 之间的数据类型转换

当数据值在 QML 和 C++ 之间交换时,它们会被 QML 引擎转换为正确的数据类型,以适合从 QML 或 C++ 使用,前提是引擎知道所涉及的数据类型。

请参阅QML 和 C++ 之间的数据类型转换(Data Type Conversion BetweenQML and C++),了解引擎支持的内置类型,以及这些类型在 QML 和 C++ 之间交换时如何转换使用。

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