класс перечисления в QVariant в QSettings

У меня проблема с классами enum, QVariants и классом QSettings. Есть значения класса enum, которые я хочу сохранить в QVariant, который входит в экземпляр QSettings. Итак, мой код на самом деле выглядит примерно так:

enum class Foo
{
    Bar1, Bar2
}
Q_ENUMS(Foo)
Q_DECLARE_METATYPE(Foo)

...

Foo value = Bar2;
QSettings settings;
settings.setValue(QString("Foo"), QVariant::fromValue(value));

В этот момент при выполнении кода появляется утверждение и жалуется:

ASSERT failure in QVariant::save: "Invalid type to save", file kernel\qvariant.cpp

Поискав в Интернете, я обнаружил, что в классе отсутствуют подходящие операторы ‹‹ и >>. Но это не вариант для классов enum. Я даже пытался использовать

qRegisterMetaType<Foo>("Foo");

но это не помогло. Может быть, у вас есть другие предложения/решения для меня. Спасибо!


person CppChris    schedule 03.04.2014    source источник


Ответы (2)


Перечисления, которые маскируются целыми числами без знака, кажутся проблемой, см.

Qt4 QSettings сохраняет значение перечисления (например, Qt::CheckState)

Решение там и, вероятно, здесь будет состоять в том, чтобы преобразовать его в неподписанный. Чтобы проверить, действителен ли результат static_cast обратно в перечисление, вы можете добавить значения Foo_lowest и Foo_highest в начало и конец диапазона перечисления.

person finite graygreen    schedule 03.04.2014
comment
Вы правы, это проблема с перечислениями в QVariant. Моя первоначальная реализация сохраняла фактические (беззнаковые) целочисленные значения в QVariant. Теперь я попробовал перечисления с областью действия, но столкнулся с этой проблемой с QVariants. Однако я вернулся к исходной реализации с помощью вашего трюка с самыми низкими/максимальными значениями в перечислении. Спасибо. - person CppChris; 07.04.2014

Вы можете использовать Q_ENUM начиная с Qt 5.5 и не беспокоиться о вызове qRegisterMetaType():

enum class Foo
{
    Bar1, Bar2
}
Q_ENUM(Foo)

...

Foo value = Foo::Bar2;
QSettings settings;
settings.setValue(QString("Foo"), QVariant::fromValue(value));
person parsley72    schedule 19.10.2018