最近学习了python 的描述器,想起之前学过的Qt 的属性系统,特此过来记录一下。
Qt的属性系统需要借助元对象来实现:
Q_PROPERTY(type name
READ getFunction
[WRITE setFunction]
[RESET resetFunction]
[NOTIFY notifySignal] )
用来为对象添加属性,包括属性的名称,读、写重置接口和告知。重置一般讲属性设置为某个默认值,告知一般定义为信号,而且一般在写接口和重置接口的末尾发出该信号。
此时定义的属性,便能通过 .property() 来获取,相当于 .property() 会调用这里定义的读方法;通过 .serproperty() 来设置属性,相当于 .setProperty() 会调用写方法。类似于python 的描述器,访问时调用 __get__() 方法;改写时调用 __set__() 方法。
另外,Qt也支持动态在运行时为对象添加属性,通过 .setProperty() 方法。
注意该方法只是为该对象动态添加,相当于python 的对象命名空间中,所以只有该对象能够查询得到。
打印对象所有的方法:
int mCount = w.metaObject()->methodCount();
for(int i = 0; i < mCount; ++i)
{
qDebug() << QString::fromLatin1(w.metaObject()->method(i).methodSignature());
}
打印对象所有的属性(动态添加的属性无法包含其中):
int pCount = w.metaObject()->propertyCount();
for(int j = 0; j < pCount; ++j)
{
qDebug() << w.metaObject()->property(j).name();
qDebug() << w.property(w.metaObject()->property(j).name());
}
打印所有的类信息(通过 Q_CLASSINFO 添加的):
int infoCount = w.metaObject()->classInfoCount();
for(int i=0; i<infoCount; i++)
{
qDebug()<< w.metaObject()->classInfo(i).name() <<" "<< w.metaObject()->classInfo(i).value();
}