Как определить, что свойство уступать не наследуется от базового класса?
Как определить, что свойство уступать не наследуется от базового класса? Я конвертирую объект в 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);
}
}
1 ответ
Свойства всегда считаются от самых базовых (то есть QObject
) к наиболее производному классу (тип экземпляра). Каждый уровень наследования имеет свой QMetaObject
и добавляет свойства поверх предыдущих, где подсчет продолжается.
Каждый класс, представленный QMetaObject
, имеет смещение свойства (то есть идентификатор первого свойства, введенного этим классом) и количество свойств (то есть идентификатор последнего свойства плюс один). Если вы хотите перебирать только свойства, представленные 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
, Однако они не равны, если между ними больше классов.