得益于Qt反射机制,我们可以获取类对象的成员信息,这其中就包含了属性信息,属性其实就是类中的一种数据成员,不同在于属性需要通过宏定义Q_PROPERTY进行注册,它的使用也必须满足反射机制的条件——类须直接或间接继承QObject且包含Q_OBJECT宏,这样就可以通过元对象的属性类(QMetaProperty)来获取属性相关信息,下面是QMetaProperty的一些常用接口说明:
bool hasNotifySignal() const //属性是否有关联信号
bool isConstant() const //属性是否是常量不能更改
bool isDesignable(const QObject *object = nullptr) const //该属性在QDesigner的属性编辑器中是否可见
bool isEnumType() const //属性是否为枚举类型
bool isFinal() const //属性FINAL声明是否为true,为true表示该属性不可被重写
bool isFlagType() const //属性是否为标志枚举类型
bool isReadable() const //属性是否可读
bool isResettable() const //属性是否可被重置
bool isScriptable(const QObject *object = nullptr) const //属性是否可被脚本引擎访问
bool isStored(const QObject *object = nullptr) const //对象状态保存时是否保存属性值
bool isUser(const QObject *object = nullptr) const //属性是否可编辑,对应属性的USER声明
bool isValid() const //属性是否有效
bool isWritable() const //属性是否可写
const char *name() const //返回属性的名称
QMetaMethod notifySignal() const //返回关联了信号的属性的QMetaMethod实例
int notifySignalIndex() const //返回属性关联通知信号的索引
int propertyIndex() const //返回属性的索引
QVariant read(const QObject *object) const //从给定对象object读取属性值
bool reset(QObject *object) const //重置给定对象object的属性值
int revision() const //返回属性指定的REVISION
QVariant::Type type() const //返回属性的类型,具体类型参考QVariant::Type
const char *typeName() const //返回属性的类型名称
int userType() const //返回属性的用户类型,返回值是 QMetaType 已注册的值之一
bool write(QObject *object, const QVariant &value) const //将value作为属性值写入对象object
这些属性信息接口都与注册属性有关,下面是关于属性注册宏Q_PROPERTY的介绍,Q_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] )
在上述Q_PROPERTY宏定义的语法中,[ ]里的表示可选项,大写字母的选项名(READ)是不能更改的,小写字母除类型(int、bool等直接给定对应类型的值)外部分(type)是自行命名定义的,各选项之间用空格隔开,如:
下面是各选项的含义说明:
type:表示属性类型,需是QVariant支持的类型(具体参考之前QVariant 类的介绍)
name:表示指定属性名称
READ getFunction:其中READ表示可读, getFunction表示读取属性值的函数名,可自行设定
注:若没有指定 MEMBER 变量,则必须指定 READ 函数,而且getFunction通常为const函数,返回值为属性的类型或属性类型的引用
WRITE setFunction :WRITE表示写入, setFunction表示设置属性值函数的名称
注:若属性为只读的则不能指定WRITE属性,setFunction的返回值必须为void且参数只能有一个
MEMBER memberName :MEMBER表示指定成员, memberName表示被指定的类成员变量名称,类成员变量的命名上与属性应该有区分(通常命名规范中类成员变量前应添加m_以表示成员变量而属性无需添加如:成员变量m_value与属性value ),该属性用于设置成员变量memberName具备可读可写性质;注:若没指定READ则必须指定MEMBER
RESET resetFunction :表示重置属性为默认值, resetFunction不能有参数和返回值
NOTIFY notifySignal :表示指定与属性关联的信号notifySignal,即当属性值变化时就会触发信号notifySignal
REVISION int :设置版本号,默认为0
DESIGNABLE bool:表示设置属性在Qt设计师的属性编辑器中是否可见,默认为true(可见)
SCRIPTABLE bool:表示设置属性是否可被脚本引擎访问,默认为true
STORED bool:设置保存对象状态时是否必须保存属性值,多数情况默认为true
USER bool:设置属性是否为可编辑属性,每一个类只能有一个USER属性指定,默认为false
CONSTANT:表示属性值是常量,常量属性不能指定WRITE与NOTIFY选项
FINAL:表示属性不能被子类重写
以上方式设置的是静态属性,在Qt中的类还可以设定动态属性,所谓动态属性就是未使用Q_PROPERTY宏注册而通过调用QObject::setProperty()方法添加的属性。动态属性可通过设置无效的QVariant对象进行删除该动态属性,另外动态属性属于类对象的实例,不满足元对象属性机制,不能使用元对象获取动态属性信息,但可使用QObject::property()进行属性值的获取。
QVariant property(const char *name) const
作用:获取指定名称属性的值,若指定名称的属性不存在则返回无效的QVariant
bool setProperty(const char *name, const QVariant &value)
作用:设置指定名称属性的值,若设置的属性已用Q_PROPERTY在类中注册,且值类型与属性类型兼容(Qt中可自动转换的类型)则设定属性值为value并返回true,若给定值类型不兼容则值设定无效并返回false;若设置的属性未使用宏定义Q_PROPERTY在类中注册,则动态添加指定名称的属性并设置给定值,此时也返回false
使用setProperty和property方法也可以设置和获取静态属性信息,若属性有相关联的读取和写入函数(getFunction与setFunction,通常Qt中属性获取函数的名称定义时前面不添加get),则可使用对应的读写函数进行读取和写入。