一文读懂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表明该属性不会被派生类中重写