如何判断 give a 属性 是否继承自 base class?

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

如何确定给定的 属性 是否继承自基础 class?我正在将一个对象转换为 QVariantList,我想在我的 list 之外保留从基础 class 继承的属性,例如 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)到最派生的 class(实例的类型)计算。每个继承级别都有自己的 QMetaObject 并在 之前的 之上添加属性 ,继续计数。

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

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

或者,如果要计算引入的属性 另一个 class,由另一个 QMetaObject *base 表示,则从其 属性 count 因为根据它的定义,这是那个 class 的最后一个 属性 加上一个等于最小派生的第一个的那个-base.

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

如果base表示meta表示的class的直接基class,则以上方法是等价的。但是,如果中间有更多 class,则它们不相等。