如何确定 give 属性是否不是从基类继承的?

How to determine if give a property isn't inherited from base class?

本文关键字:基类 继承 何确定 give 属性 是否      更新时间:2023-10-16

如何确定是否给属性不是继承自基类?我正在将对象转换为QVariantList,我想让我的list从基类继承属性,如objectNameQObject

 QVariantList list;
 const QMetaObject *meta = obj->metaObject();
            for(int i = 0, len = meta->propertyCount(); i < len; ++i)
            {
                QMetaProperty prop = meta->property(i);
                if(porp isn't inherited from base class) {
                  const char *name = prop.name();
                  QVariant value = obj->property(name);
                  QVariantMap map;
                  map.insert(name, value);
                  list.append(map);
               }
            }

属性总是从最基本的(即QObject)到最派生的类(实例的类型)进行计数。每一层继承都有自己的QMetaObject,并在之上添加属性,继续计数。

每个类,由它的QMetaObject表示,有一个属性offset(即该类引入的第一个属性的ID)和属性count(即最后一个属性的ID加1)。如果您只想迭代QMetaObject *meta引入的属性(不包括继承的属性),那么从偏移量:

开始计数。
for(int i = meta->propertyOffset(), len = meta->propertyCount(); i < len; ++i)

或者,如果您想计数另一个由另一个QMetaObject *base表示的类引入的属性,则从它的属性计数开始计数,因为根据其定义,是该类的最后一个属性加上一个等于自基底以来最小导数的第一个属性。

for(int i = base->propertyCount(), len = meta->propertyCount(); i < len; ++i)

如果base代表meta所代表的类的直接基类,则上述方法相等。但是,如果中间有更多的类,它们就不相等了。