Доступ к перечислению сохранен в QVariant

Я зарегистрировал перечисляемый тип "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

6
задан Henry Thacker 1 April 2010 в 12:24
поделиться

2 ответа

Для этого можно использовать операторы >> и << 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)
1
ответ дан 17 December 2019 в 07:02
поделиться

Попробуйте:

int x = variantValue.value<ClefType>();
1
ответ дан 17 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: