常见的四种QML与c++集成解决方案汇总

11 篇文章 0 订阅
8 篇文章 1 订阅
本文介绍了如何在QML中利用C++扩展功能,包括混合使用QML、JavaScript和C++开发应用程序,以及从C++访问和操作QML对象。主要讨论了C++类如何注册为QML类型、如何通过上下文属性暴露C++对象,以及如何在两者间进行数据类型转换。强调了正确选择集成方法的重要性,并警告避免过度操作QML对象以保持UI和逻辑分离。
摘要由CSDN通过智能技术生成

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++ 之间的数据类型转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Meta.Qing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值