本文将针对使用C++创建QML对象的方式进行总结。
在C++中创建QML对象
有时我们希望能够从C++中向QML发送数据,这种情况需要我们在C++中创建QML可以识别的对象,本节将对C++中创建QML对象的方法进行总结。
继承QQuickItem类
当我们需要创建一个QML对象时,我们需要继承QQuickItem类
1 | class Squircle : public QQuickItem |
属性系统
一个类的属性就是一个类的成员变量,由于QML与C++语法不互通,我们需要一个属性声明系统,让QML能够辨识C++中的成员及成员函数,这个属性系统能够声明C++中的一个成员变量,并提供访问的读/写操作
1 | Q_PROPERTY(qreal t READ t WRITE setT NOTIFY tChanged) |
在上面这行语句中,我们声明了一个类型为qreal的t变量,同时赋予了读方法t
和写方法setT
,NOTIFY为给属性值设置相应信号。
Q_PROPERTY常用格式
指定读取属性的函数
1 | Class Widget : public QObject |
修改属性的函数
1 | Class Widget : public QObject |
我们限定set函数无返回值且只能有一个输入参数
导出成员变量为属性值
上面两个读/写的属性值都不是类中的成员变量,是凭空声明出来的一个属性值。要想将类中已有的成员变量设置为属性值,需要用 MEMBER
关键字。这样focus
这个属性值就变的可读可写了。要读可以用类自己的 hasFocus()
函数,要写用自带的setFocus()
修改 m_focus
变量就可以了,属性值会自动更新。
1 | Class Widget : public QObject |
虽然READ
、WRITE
、MEMBER
这三个关键字都可以赋予属性值可读可写的特性,但是 READ
、WRITE
和 MEMBER
不能同时使用,赋予可读可写特性一次就够了,不能赋予两次。就好像一个对象不能被析构两次一样。
给属性设置关联信号
1 | Class Widget : public QObject |
这样,在m_focus
发生变化时,可以自动发送信号`focusChanged