Для этого вы можете использовать операторы >>
и <<
в QVariant.
Сохранение (где MyClass *x = new MyClass(this);
и out
- это QDataStream
):
const QMetaObject *pObj = x->pObj();
for(int id = pObj->propertyOffset(); id < pObj->propertyCount(); ++id)
{
QMetaProperty pMeta = pObj->property(id);
if(pMeta.isReadable() && pMeta.isWritable() && pMeta.isValid())
{
QVariant variantValue = pMeta.read(x);
out << variantValue;
}
}
Загрузка:
const QMetaObject *pObj = x->pObj();
for(int id = pObj->propertyOffset(); id < pObj->propertyCount(); ++id)
{
QMetaProperty pMeta = pObj->property(id);
if(pMeta.isReadable() && pMeta.isWritable() && pMeta.isValid())
{
QVariant variantValue;
in >> variantValue;
pMeta.write(x, variantValue);
}
}
Вам нужно будет позвонить
qRegisterMetaType<CMyClass::ClefType>("ClefType");
qRegisterMetaTypeStreamOperators<int>("ClefType");
в дополнение к использованию Q_OBJECT
, Q_ENUMS
и Q_PROPERTY
. Вызов qRegisterMetaTypeStreamOperators<int>
говорит Qt использовать int версии operator<<
и operator>>
.
Кстати: использование qRegisterMetaType<CMyClass::ClefType>()
вместо формы, которая принимает имя, не работает для меня. Возможно, если вы использовали возвращенный идентификатор для поиска имени, но это намного проще.
К вашему сведению, вот определение MyClass
:
class CMyClass : public QObject
{
Q_OBJECT
Q_ENUMS(ClefType)
Q_PROPERTY(ClefType cleftype READ getCleftype WRITE setCleftype)
public:
CMyClass(QObject *parent) : QObject(parent), m_cleftype(One)
{
qRegisterMetaType<CMyClass::ClefType>("ClefType");
qRegisterMetaTypeStreamOperators<int>("ClefType");
}
enum ClefType { Zero, One, Two, Three };
void setCleftype(ClefType t) { m_cleftype = t; }
ClefType getCleftype() const { return m_cleftype; }
private:
ClefType m_cleftype;
};
Q_DECLARE_METATYPE(CMyClass::ClefType)