QML与C++ 集成概览

QML与C++ 集成概览

QML被设计为很容易从C++ 代码中得到扩展。Qt QML模块中的类允许QML对象从C++ 加载和操作。QML的引擎特性和Qt元对象系统允许直接从QML中使用C++ 的能力。这能实现使用QML、JavaScript和C++ 代码进行应用程序的混合开发。
QML与C++ 的集成有着广泛的可能性,包括以下能力:

  • 从逻辑代码中分离出用户界面代码,在QML文件中使用QML、JavaScript实现用户界面,逻辑代码使用C++
  • 从QML中使用或激活C++ 能力(比如,激活应用逻辑,使用C++ 中实现的数据模型,或调用三方C++ 库中的函数)
  • 访问Qt QML或Qt Quick C++ API中的API(比如,使用 QQuickImageProvider 动态生成图片)
  • 从C++ 里实现自定义的 QML 对象类型——不论是用在自己特定的应用中,还是发行给其它人用。

为了给QML提供一些C++ 数据和函数,必须从QObject继承类。由于 QML 引擎与元对象系统的集成,可以从QML中访问任何从QObject继承的类的属性、方法和信号,在将C++ 类的属性暴露给QML有详细描述。一旦所需要的功能可以由类来提供,则有以下方法将其暴露给QML:

  • 类可以被注册为可实例化的QML类型,这样它就可以被实例化,并象使用普通QML 对象类型那样,在QML中使用它了
  • 类可以注册为单例类型,这样类的单例就可以从QML代码中导入,允许从QML中访问实例的属性、方法 和 信号
  • 类的实例可以以context 属性或context对象 的形式被嵌入QML代码,允许从QML中访问实例的属性、方法 和 信号

这些是从QML代码访问C++ 的最常用的方法。更多方法与细节,查看本文档以下内容。而且,除了具备从QML访问C++ 的能力 ,Qt QML模块也提供了从C++ 访问QML的方法。从C++ 与QML对象的互操作查看更多细节。
最后,C++ 代码既可以在应用中集成,也可以在插件中集成,这取决于它将被发布为应用还是库文件。插件可以集成QML模块,以方便被导入,并在其它应用中的QML代码使用。通过在C++ 插件提供类型与功能了解更多细节。

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

为了能更快地为你的场景选择合适的集成方法,可以参考下图:

想了解以上图表中的宏,可以点击文档从C++ 中定义DML类型

将C++ 类的属性暴露给QML

由于QML引擎与Qt元对象系统的集成,QML很容易从C++ 端扩展。这种集成可以让继承自QObject的类的属性、方法和信号从QML中访问:属性可以读取和修改,方法可以被JavaScript表达式调用,必要时信号处理函数可以自动创建。而且,继承自QObject的类的枚举值可以从QML中访问。
将C++ 类型的属性暴露给QML中查看更多信息。

从C++ 定义QML类型

QML类型可以在C++ 中定义,然后使用QML类型系统来注册。这允许C++ 类被实例化为一个QML 对象类型,允许自定义对象类型以C++ 实现并集成到已存在的QML代码中。一个C++ 类可以以其它目的注册:比如,注册为单例类型,以允许从QML代码中导入单例实例,或从QML中访问不可实例化的类的枚举值。
而且,Qt QML模块提供了定义QML类型的机制,这些类型包括绑定属性和默认属性。
想了解更多从C++ 注册和创建自定义QML类型的信息,可以查看文档从C++ 定义QML类型

用Context属性在QML中嵌入C++ 对象

使用context 属性或context 对象,C++ 对象和值可以直接被嵌入到所加载QML对象的上下文(或 范围)。这是通过Qt QML模块提供的QQmlContext类实现的,它暴露数据给QML组件的上下文,允许数据从C++ 注入到QML。
点击用Context属性在QML中嵌入C++ 对象了解更多。

C++ 操作QML对象

QML对象类型可以在C++ 中被实例化和检测,以便访问它们的属性、激活其方法、以及接收信号通知。这归因于,所有QML对象类型是由继承自QObject的类实现的,这一事实,这允许QML引擎动态加载并通过Qt元对象系统检测对象。

警告:虽然可以从C++ 访问QML对象并操作它们,但并不推荐这么做,除非出于元型测试目的。QML 和 C++ 集成的优势之一是能够在 QML 中实现 UI,与 C++ 逻辑和数据操作后端分开,如果C++ 开始直接操作QML,就破坏了这一优势。这种方法也使得只修改用户界面而不影响相应的C++ 端 变得困难。

了解更多从C++ 访问QML对象的信息,点击查看文档C++ 操作QML对象

QML与C++ 间的数据类型转换

当数据在QML 和 C++ 之间交换时,QML引擎会对其转换,以便能够QML正确使用; 或C++ 会提供引擎能够识别的数据类型。
QML与C++ 间的数据类型转换一文中有关于引擎所支持的内置类型,以及这些类型在QML和C++ 间交换数据时如何进行转换。

posted @ 2022-05-06 09:43  sammy621  阅读(437)  评论(0编辑  收藏  举报