如何判断 give a 属性 是否继承自 base class?
How to determine if give a property isn't inherited from base class?
如何确定给定的 属性 是否继承自基础 class?我正在将一个对象转换为 QVariantList
,我想在我的 list
之外保留从基础 class 继承的属性,例如 objectName
从 QObject
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,则它们不相等。
如何确定给定的 属性 是否继承自基础 class?我正在将一个对象转换为 QVariantList
,我想在我的 list
之外保留从基础 class 继承的属性,例如 objectName
从 QObject
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,则它们不相等。