一文读懂Qt C++与QML混合编程

1·QML使用C++步骤

1·1从QObject派生

   为了向QML提供一些C ++数据或功能,必须从QObject派生的类中使它可用。 将C ++类型的属性公开给QML后,由于QML引擎已与元对象系统集成,因此可以从QML访问任何QObject派生类的属性,方法和信号。

  • 从 QObject 或 QObject 的派生类继承
  • 使用 Q_OBJECT 宏

1.2注册方法

1.2.1注册概述

  可以通过多种方式将C++功能类公开给QML。
QML引擎允许实例化和非实例化类型的注册。
注册可实例化的类型可使C ++类用作QML对象类型的定义,从而允许将其用于QML代码的对象声明中以创建此类型的对象。注册还为引擎提供了其他类型的元数据,使该类型(以及该类声明的任何枚举)可用作属性值,方法参数和返回值以及在QML和C ++之间交换的信号参数的数据类型。

1.2.2注册的类型

  • C++类可以注册为可实例化的QML类型,因此可以像QML代码中的任何普通QML对象类型一样进行实例化和使用。
  • C++类可以注册为单例类型,以便可以从QML代码导入该类的单个实例,从而允许从QML访问该实例的属性,方法和信号。
  • C++类的实例可以作为上下文属性或上下文对象嵌入到QML代码中,从而允许从QML访问该实例的属性,方法和信号。

1.2.3各种注册类型的使用方法

1.2.3.1注册实例化对象类型

任何QObject派生的C ++类都可以注册为QML对象类型的定义。
一旦在QML类型系统中注册了一个类,就可以像声明QML代码中的任何其他对象类型一样声明和实例化该类。 一旦创建了一个类实例,就可以从QML中对其进行操作。 正如将C ++类型的属性暴露给QML所解释的那样,可以从QML代码访问任何QObject派生类的属性,方法和信号。
要将QObject派生的类注册为可实例化的QML对象类型,请调用qmlRegisterType()将该类作为QML类型注册到特定的类型名称空间中。 然后,可以导入该名称空间以使用该类型。

1 class Message : public QObject
2 {
3     Q_OBJECT
4     Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
5     Q_PROPERTY(QDateTime creationDate READ creationDate WRITE setCreationDate NOTIFY creationDateChanged)
6 public:
7     // ...
8 };

代码解读:Message类继承QObject,Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property

Q_PROPERTY(type name
             (READ getFunction [WRITE setFunction] |
              MEMBER memberName [(READ getFunction | WRITE setFunction)])
             [RESET resetFunction]
             [NOTIFY notifySignal]
             [REVISION int]
             [DESIGNABLE bool]
             [SCRIPTABLE bool]
             [STORED bool]
             [USER bool]
             [CONSTANT]
             [FINAL])

 一个属性行为类似于类里面的数据成员,但是他是却可以通过Meta-Object System来访问。    在外界看来,property跟类中数据成员没有什么区别,但是还是有几点不一样,参考qt文档,主要有以下几点:

1.必须有一个read函数。它用来读取属性值。因此用Const限定。它的返回值类型必须为属性类型或者属性类型的引用或者指针。不能是其他类型例如:QWidget::hasFocus().  

2.有一个可选的write函数。它用来设置属性值,它的返回值必须为void型,而起必须要含有一个参数。例如:QWidget::setEnabled()

3.一个reset函数能够把property设置成其默认状态,它也是可选的。复位功能必须返回void,并且不带参数,

4.一个NOTIFY信号是可选的 。如果定义,它提供了一个信号这个信号在值发生改变时会自动被触发。

5.如果定义了"STODE"属性表明这是一直存在的。QWidget::minimumSize() 6.一个"DESIGNABLE"属性表明该property能在GUI builder(一般为Qt Designer)可见

7.USER 属性 表面是否可以被用户所编辑

8 CONST设定属性是不可修改的 所以不能跟WRITE或者NOTIFY同时出现

9 FINAL表明该属性不会被派生类中重写

原文地址:https://www.cnblogs.com/GaJack/p/14153842.html