Я зарегистрировал перечисляемый тип "ClefType" в моем заголовочном файле - это перечисление регистрируется в системе MetaObject с помощью Q_DECLARE_METATYPE и макросов Q_ENUMS. qRegisterMetaType также называют в конструкторе класса.
Это позволяет мне использовать этот тип в Q_PROPERTY, это все хорошо работает. Однако позже я должен смочь овладеть Q_PROPERTY этого перечислимого типа, учитывая объект - в форме, которая подходит для сериализации.
Идеально, было бы полезно сохранить целочисленное значение для того перечислимого участника, потому что я не хочу, чтобы это было характерно для типа перечисления, которое используется - в конечном счете я хочу иметь несколько различных перечислений.
// This is inside a loop over all the properties on a given object
QMetaProperty property = metaObject->property(propertyId);
QString propertyName = propertyMeta.name();
QVariant variantValue = propertyMeta.read(serializeObject);
// If, internally, this QVariant is of type 'ClefType',
// how do I pull out the integer value for this enum?
К сожалению, variantValue.toInt();
не работает - пользовательские перечисления, кажется, не непосредственно 'castable' к целочисленному значению.
Заранее спасибо,
Henry
Для этого можно использовать операторы >>
и <<
QVariant.
Сохранение (где MyClass * x = новый 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
сообщает Qt использовать версии int operator <<
и operator >>
.
Кстати: использование qRegisterMetaType
вместо формы, которая принимает имя, у меня не работает. Возможно, если вы использовали возвращенный идентификатор для поиска имени, но это намного проще.
К вашему сведению, вот определение 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)