概述 - QML 和 C++ 集成

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

集成 QML 和 C++ 提供了多种机会,包括:

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

要向 QML 提供一些 C++ 数据或功能,它必须从 QObject-派生类中提供。由于 QML 引擎与元对象系统的集成,任何 QObject-派生类的属性、方法和信号都可通过 QML 访问,如 向 QML 暴露 C++ 类型属性 中所述。一旦此类提供所需的功能,它可以通过各种方式在 QML 中公开。

  • 类可以被 注册为一个可实例化的 QML 类型,因此它可以从 QML 代码中实例化和使用,就像任何常规的 QML 对象类型 一样
  • 类可以被注册为 单例类型,以便从 QML 代码导入类的单个实例,允许从 QML 访问实例的属性、方法和信号
  • 类的实例可以作为 上下文属性上下文对象 嵌入到 QML 代码中,允许从 QML 访问实例的属性、方法和信号

以下是使用 QML 代码访问 C++ 功能的最常用方法;有关更多选项和详细信息,请参阅以下部分描述的主要文档页面。此外,除了可以从 QML 访问 C++ 功能之外,Qt Qml 模块还提供了从 C++ 代码反向操作和操作 QML 对象的方法。有关更多详情,请参阅从 C++ 与 QML 对象交互

通常有必要将某些状态作为全局属性暴露给 QML。有关如何进行此操作的描述,请参阅从 C++ 将状态公开到 QML

最后,根据是否需要作为独立应用程序或库发布,C++ 代码可以集成到 C++ 应用程序或 C++ 插件中。插件可以与 QML 模块集成,然后可以被其他应用程序中的 QML 代码导入和使用;有关更多信息,请参阅在 C++ 插件中提供类型和功能

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

为了快速确定哪种集成方法适合您的情况,可以参考以下流程图。

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

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

由于 QML 引擎与 Qt 元对象系统的集成,QML 可以轻松地从 C++ 扩展。这种集成使得任何由QObject派生的类的属性、方法和信号都可以从 QML 访问:属性可以读取和修改,方法可以从 JavaScript 表达式调用,并在需要时自动创建信号的处理程序。此外,从 QML 中可以访问QObject派生类的枚举值。

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

从 C++ 定义 QML 类型

可以在 C++ 中定义 QML 类型并将其注册到QML 类型系统中。这允许将 C++ 类实例化为 QML 对象类型,从而可以在 C++ 中实现自定义对象类型并将它们集成到现有的 QML 代码中。C++ 类也可以注册用于其他目的:例如,可以将它注册为 单例类型,以便 QML 代码可以导入单个类实例,或者可以将其注册以允许从 QML 访问不可实例化的类的枚举值。

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

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

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

可以使用 上下文属性上下文对象 将 C++ 对象和值直接嵌入已加载的 QML 对象的上下文(或 作用域)。这是通过QQmlContext 类实现的,它由Qt Qml 模块提供,该模块将数据公开给 QML 组件的上下文,从而允许从 C++ 将数据注入到 QML 中。

有关更多信息,请参阅使用上下文属性将 C++ 对象嵌入 QML

从 C++ 与 QML 对象交互

可以从 C++ 中实例化 QML 对象并检查它们,以便访问其属性、调用其方法和接收其信号通知。这是由于所有 QML 对象类型都使用 QObject 派生类实现,使得 QML 引擎能够通过 Qt 元对象系统动态加载和自省对象。

警告: 虽然从 C++ 访问 QML 对象并操作它们是可能的,但除了测试和原型设计目的外,这不是推荐的方法。QML 和 C++ 集成的一个优点是能够独立于 C++ 逻辑和后端数据集在 QML 中实现 UI,如果 C++ 端开始直接操作 QML,这就会失败。这种方法也使得在不影响对应的 C++ 端的情况下更改 QML UI 变得困难。

有关从 C++ 访问 QML 对象的更多信息,请参阅有关 从 C++ 与 QML 对象交互 的文档,以及最佳实践页面上的 从 C++ 到 QML 暴露数据 部分。

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

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

有关引擎支持的内建类型及其在 QML 和 C++ 之间交换时如何转换的信息,请参阅 QML 和 C++ 之间的数据类型转换

© 2024 The Qt Company Ltd。此处包含的文档贡献的版权属于各自的所有者。此处提供的文档是根据由自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款许可的。Qt 和相应的标志是芬兰和/或其他国家的 The Qt Company Ltd 的商标。所有其他商标都是其各自所有者的财产。