Qt反射机制获取属性信息

一、反射系统
1、QMetaProperty 类
①、作用:用于描述对象的属性,可使用该类的成员函数获取对象属性的信息。
②、该类拥有一系列的返回 bool 值的成员函数,用于判断属性的行为(见下表)

isReadable()    可读返回true
isEnumType() 	若属性的类型是枚举,则返回 true
isWritable() 	可写返回 true 
isFinal() 		声明属性时 FINAL 是否为 true
isValid() 		属性有效则返回 true。 
isFlagType() 	若属性的类型是标志枚举,则返回 true
isConstant() 	声明属性时CONSTANT 是否为 true
isResettable() 	若属性可被重置为默认值同返回 true, 即声明属性时指定了 RESET 函数
bool isUser(const QObject* object=Q_NULLPTR) const 		声明属性时 USER 是否为 true
bool isStored(const QObject* object=Q_NULLPTR) const 	声明属性时 STORED 是否为 true
bool isScriptable(const QObject* object=Q_NULLPTR) 		声明属性时 SCRIPTABLE 是否为 true
bool isDesignable(const QObject* object=Q_NULLPTR) 		声明属性时 DESIGNABLE 是否为 true

2、其他成员函数如下

const char* name() const; 		获取属性的名称
const char* typeName() const; 	返回此属性类型的名称。
QVariant::Type type() const;	返回属性的类型,其值为 QVariant::Type 的枚举值之一。
int userType() const;			返回此属性的用户类型,返回值是使用 QMetaType 注册的值之一(是 QMetaType类中的一个枚举值),若类型未注册,则返回 QMetaType::UnknownType
int propertyIndex() const; 		返回此属性的索引。
QMetaEnum enumerator() const;	若属性的类型是枚举类型则返回该枚举,否则返回的值是未定义的。
QVariant read(const QObject* object) const; 从给定的对象 object 读取属性的值,若能读取值则返回该值,否则返回一个无效的 QVariant 对象。
bool write(QObject* object, const QVariant & v) const;
								把值 v 作为属性值写入给定的对象 object 中,若写入成功,则返回 true,否则返回 false。若值的类型与属性的类型不相同,则尝试进行转换,若属性是可重置的,
								则空的 QVariant 对象(即无效的 QVariant 对象)等价于调用 reset()函数,或者以其他方式设置一个默认构造的对象。
bool reset(QObject* object) const; 	使用 RESET 函数重置给定的对象 object 的属性,若重置成功,则返回 true,否则返回 false
bool hasNotifySignal() const;		若属性有通知信号,则返回 true,否则返回 false。  
QMetaMethod notifySignal() const; 	若属性指定了通知信号,则返回该信号的 QMetaMethod 实例,否则返回无效的QMetaMethod
int notifySignalIndex() const; 		返回属性通知信号的索引,否则返回-1。

3、QMetaObject 类中与属性有关的成员函数有

int indexOfProperty(const char* name) const; 返回属性 name 的索引,否则返回-1。  
int propertyCount() const; 返回属性的数量(包括从父类继承的属性)  
int propertyOffset() const; 返回父类中的属性数量,也就是说此返回值是此类第一个属性的索引位置。
QMetaProperty property(int index) const; 返回索引号为 index 的属性的元数据,若不存在这样的属性,则返回空的QMetaProperty
QMetaProperty userProperty() const; 返回 USER 标志设置为 true 的属性的元数据。

代码示例

class Z:public QObject
{ 
	Q_OBJECT
public:
	Q_PROPERTY(int b READ gb WRITE sb)
	int gb(){return m_mb;} 
	void sb(int x){m_mb=x;}
	int m_mb; 
 };

#include<QMetaProperty>
int main(int argc, char *argv[])
{
	Z mz;
	const QMetaObject *p=mz.metaObject();
	QMetaProperty pe=p->property(p->indexOfProperty("b")); //获取属性 b 的元数据。
	cout<<pe.name()<<endl; //输出属性的名称 b
	cout<<pe.typeName()<<endl; //输出属性 b 的类型 int
	pe.write(&mz,47); //把值 47 写入属性 b
	cout<<pe.read(&mz).value<int>()<<endl; //输出属性 b 的值 47。
	return 0; 
 }
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值