QML 旨在通过 C++ 代码轻松扩展。qt qml模块中的类允许从 C++ 加载和操作 QML 对象,并且 QML 引擎与 Qt元对象系统集成的特性使 C++ 功能可以直接从 QML 调用。这允许开发使用 QML、JavaScript 和 C++ 代码混合实现的混合应用程序。
集成 QML 和 C++ 提供了多种机会,包括:
- 通过在QML 文档中使用 QML 和 JavaScript 实现用户界面代码和使用 C++实现用户界面代码和应用程序逻辑代码
- 使用和调用 QML 中的一些 C++ 功能(例如,调用您的应用程序逻辑,使用以 C++ 实现的数据模型,或调用第三方 C++ 库中的一些函数)
- 访问Qt QML或Qt Quick C++ API 中的功能(例如,使用QQuickImageProvider动态生成图像)
- 从 C++实现您自己的QML 对象类型——无论是在您自己的特定应用程序中使用,还是分发给其他人
为了向 QML 提供一些 C++ 数据或功能,它必须从QObject派生类中可用。由于 QML 引擎与元对象系统的集成,任何QObject派生类的属性、方法和信号都可以从 QML 访问,如将 C++ 类型的属性暴露给 QML中所述。一旦这样的类提供了所需的功能,它就可以通过多种方式暴露给 QML:
- 该类可以注册为可实例化的 QML 类型,以便可以像QML 代码中的任何普通QML 对象类型一样实例化和使用它
- 该类可以注册为单例类型,以便可以从 QML 代码中导入该类的单个实例,从而允许从 QML 访问实例的属性、方法和信号
- 类的实例可以作为上下文属性或上下文对象嵌入到 QML 代码中,从而允许从 QML 访问实例的属性、方法和信号
这些是从 QML 代码访问 C++ 功能的最常用方法;有关更多选项和详细信息,请参阅以下部分中描述的主要文档页面。此外,除了从 QML 访问 C++ 功能的能力之外,Qt QML模块还提供了从 C++ 代码执行反向操作和操作 QML 对象的方法。有关更多详细信息,请参阅与 C++ 中的 QML 对象交互。
最后,C++ 代码可以集成到 C++ 应用程序或 C++ 插件中,具体取决于它是作为独立应用程序还是作为库分发。插件可以与 QML 模块集成,然后可以在其他应用程序中由 QML 代码导入和使用;有关更多信息,请参阅在 C++ 插件中提供类型和功能。
1.在 C++ 和 QML 之间选择正确的集成方法
要快速确定哪种集成方法适合您的情况,可以使用以下流程图:
2.将 C++ 类的属性暴露给 QML
由于 QML 引擎与 Qt 元对象系统的集成,QML 可以很容易地从 C++ 扩展。这种集成允许从 QML 访问任何QObject派生类的属性、方法和信号:可以读取和修改属性,可以从 JavaScript 表达式调用方法,并根据需要为信号自动创建信号处理程序。此外,可以从 QML 访问QObject派生类的枚举值。
有关详细信息,请参阅向 QML 公开 C++ 类型的属性。
3. 从 C++ 定义 QML 类型
QML 类型可以在 C++ 中定义,然后在QML 类型系统中注册。这允许将 C++ 类实例化为QML 对象类型,从而使自定义对象类型能够在 C++ 中实现并集成到现有的 QML 代码中。C++ 类也可以注册用于其他目的:例如,它可以注册为Singleton Type以使单个类实例能够通过 QML 代码导入,或者它可以注册以启用非实例化的枚举值可以从 QML 访问的类。
此外,Qt QML模块提供了定义与 QML 概念(如附加属性和默认属性)集成的 QML 类型的机制。
有关从 C++ 注册和创建自定义 QML 类型的更多信息,请参阅从 C++文档定义 QML 类型。
4.使用上下文属性将 C++ 对象嵌入 QML
C++ 对象和值可以使用上下文属性和上下文对象直接嵌入到加载的 QML 对象的上下文(或范围)中。这是通过Qt QML模块提供的QQmlContext类实现的,该类将数据暴露给 QML 组件的上下文,从而允许将数据从 C++ 注入 QML。
有关更多信息,请参阅使用上下文属性将 C++ 对象嵌入 QML。
5.从 C++ 与 QML 对象交互
QML 对象类型可以从 C++ 实例化和检查,以便访问它们的属性、调用它们的方法并接收它们的信号通知。这是可能的,因为所有 QML 对象类型都是使用QObject派生类实现的,使 QML 引擎能够通过 Qt 元对象系统动态加载和内省对象。
警告:虽然可以从 C++ 访问 QML 对象并对其进行操作,但这不是推荐的方法,除非用于测试和原型设计目的。QML 和 C++ 集成的优势之一是能够在 QML 中实现与 C++ 逻辑和数据集后端分开的 UI,如果 C++ 端开始直接操作 QML,这将失败。这种方法还使得在不影响其 C++ 对应物的情况下更改 QML UI 变得困难。
有关从 C++ 访问 QML 对象的更多信息,请参阅有关从 C++ 与 QML 对象交互的文档。
6.QML 和 C++ 之间的数据类型转换
在 QML 和 C++ 之间交换数据值时,它们由 QML 引擎转换为具有适用于 QML 或 C++ 的正确数据类型,前提是引擎知道所涉及的数据类型。
有关引擎支持的内置类型以及在 QML 和 C++ 之间交换时如何转换这些类型以供使用的信息,请参阅QML 和 C++ 之间的数据类型转换。