[英]How to determine if give a property isn't inherited from base class?
如何確定給定的屬性是否不是從基類繼承的? 我的對象轉換為QVariantList
,我想保持我的的list
從基類繼承的屬性,比如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
)到最派生的類(實例的類型)計算。 每一級繼承都有自己的QMetaObject
並在之前的屬性之上添加屬性,繼續計數。
每個由其QMetaObject
表示的類都有一個屬性偏移量(即該類引入的第一個屬性的 ID)和屬性計數(即最后一個屬性的 ID 加一)。 如果您只想迭代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
表示的類的直接基類,則上述方法是相等的。 然而,如果兩者之間有更多的類,它們就不相等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.