QT 属性系统

来源:互联网 发布:思纬网络 编辑:程序博客网 时间:2024/06/10 04:28

最近学习了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();        }


0 0
原创粉丝点击