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

11 篇文章 0 订阅
8 篇文章 1 订阅

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QMLC++ 交互的过程一般分为以下几个步骤: 1. 定义 C++ 类并注册到 QML 中 你需要在 C++ 中定义一个类,该类封装了你想要实现的功能。同时,你需要使用 `qmlRegisterType` 函数将该类注册到 QML 中,以便在 QML 中使用该类。 例如,你可以定义一个名为 `MyClass` 的类,并将其注册到 QML 中: ```cpp class MyClass : public QObject { Q_OBJECT public: Q_INVOKABLE int myFunction(int arg) { // 实现你的功能 } }; qmlRegisterType<MyClass>("com.example", 1, 0, "MyClass"); ``` 在上面的代码中,`Q_INVOKABLE` 用于声明 `myFunction` 函数可从 QML 中调用,`qmlRegisterType` 函数用于将 `MyClass` 类注册到 QML 中。`"com.example"` 表示注册的命名空间,`1` 和 `0` 表示主版本号和次版本号,`"MyClass"` 是在 QML 中使用的类名。 2. 在 QML 中使用 C++ 类 在 QML 中使用 C++ 类时,你需要使用 `import` 语句导入该类所在的命名空间。然后,你可以通过该命名空间来访问该类。例如: ```qml import com.example 1.0 MyClass { id: myClass } Button { onClicked: { var result = myClass.myFunction(42) // 处理返回值 } } ``` 在上面的代码中,`import` 语句用于导入 `com.example` 命名空间,`MyClass` 用于创建一个 `MyClass` 实例,`id` 属性用于设置实例的标识符,`Button` 用于创建一个按钮,`onClicked` 事件处理程序中调用了 `myFunction` 函数,并处理了它的返回值。 3. 在 C++ 中访问 QML 中的对象 如果你需要从 C++ 中访问 QML 中的对象,你可以使用 `QQuickItem` 类提供的 `findChild` 函数。例如: ```cpp QQuickItem *item = qmlEngine.rootObjects().value(0)->findChild<QQuickItem*>("myItem"); if (item) { // 处理 item 对象 } ``` 在上面的代码中,`qmlEngine.rootObjects()` 函数返回 QML 引擎中所有的根对象,`value(0)` 返回第一个根对象,`findChild` 函数用于查找名为 `"myItem"` 的子对象。 以上就是 QMLC++ 交互的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Meta.Qing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值