在初学Qt的过程当中,时不时地要经过F2快捷键来查看QT类的定义,发现类定义中有许多Q_PROPERTY的东西,好比最经常使用的QWidget的类定义:函数
Qt中的Q_PROPERTY宏在Qt中是很经常使用的,那么它有什么做用呢? ui
Qt提供了一个绝妙的属性系统,Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,因为该宏是qt特有的,须要用moc进行编译,故必须继承于QObject类。spa
通常咱们说一个类有什么属性,指的就是这个类有啥成员变量。好比 People 类中有个 int age 的私有成员变量,咱们就能够说这个 People 类有个“年龄”属性能够更改读取。3d
Qt 提供的这个属性系统,做用就是把类的信息暴露出来成为通用的你们都认识的信息。好比用 C++ 语言写的People 类中有个 int age 变量,可是若是用 QML 语言去读取就会出问题,由于 QML 有本身的规则,它不认识 C++ 啊。怎么办呢?用 Qt 的属性系统就能够解决这个问题。属性系统能够这样理解:当一个类的成员变量或者成员函数用属性系统处理一下,它们就从 C++ 内部中暴露出来,并且你们都认得。对象
属性系统是专门为元对象系统服务的。blog
Q_PROPERTY(type name
READ getFunction
[WRITE setFunction]
[RESET resetFunction]
[NOTIFY notifySignal]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool]
[USER bool]
[CONSTANT]
[FINAL])继承
以前一直在使用VS开发C++程序,接触过开发Ocx控件会有控件属性设置,Qt这里的属性系统能够和以前的知识联系起来,Qt的属性功能使得咱们能够选择访问数据成员的方式,属性就像是类的数据成员,可是在元对象系统中,它的其余特性是处处可见的(相比较于类成员的通常状况下私有化)。ip
咱们使用这个宏的时候,注意两个问题:ci
1)类型,属性名和READ(读)方法是必须的。也就是前三个参数可必须有的。类型能够是QVariant支持的任一类型,又或者是咱们自定义的类型,其余是可选的。下面的title属性定义能够这么来讲明:定义一个属性title,类型是QString,读title的方法是title()函数,写title的方法是setTitle,这里USER表示是否用户自定义类型,这里应该设置为false。开发
2)属性声明完了之后,咱们还须要进行读写函数的声明和定义
为何要使用它呢?在哪里使用它呢?
答:Qt中类的属性是给脚本和元对象系统用的,好比QtScript,QML,或者QObject::property/setProperty……,主要就是用来进行属性封装,在具体的脚本,库,qml开发中必须使用。
最多见的是在QML中访问C++,经过C++类暴露属性来使用,接上面实例以下:
一、新建Qt Quick工程:qt PROPERTY
二、新建C++类TestProperty,公有继承于QObject
三、为TestProperty类设置上述属性title
Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged);
四、属性读写函数声明与实现
class TestProperty : public QObject
{
Q_OBJECT
public:
explicit TestProperty(QObject *parent = nullptr);
Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged);
QString title();
void setTitle(QString strTitle);
signals:
void titleChanged();
public slots:
private:
QString m_title;
};
QString TestProperty::title()
{
return m_title;
}
void TestProperty::setTitle(QString strTitle)
{
m_title = strTitle;
emit titleChanged();
}
五、在main函数中注册这个类,导出到qml中
#include <qglobal.h>
#include "TestProperty.h"
qmlRegisterType<TestProperty>("TestProperty", 1, 0, "TestProperty");
六、在qml中调用title属性
import QtQuick 2.9
import QtQuick.Window 2.2
import TestProperty 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello Qt")
TestProperty{
id: testProperty
title: qsTr("Hello World")
}
Component.onCompleted: {
title = testProperty.title;
}
}
运行后: