2014-04-03 8 views
5

Mam problem z klasami wyliczeń, QVariants i klasy QSettings. Istnieją wartości klasy enum, które chcę przechowywać w QVariant, który przechodzi do instancji QSettings. Tak, mój kod faktycznie wygląda mniej więcej tak:klasa enum w QVariant w 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)); 

W tym momencie w trakcie wykonywania kodu, twierdzenie skacze i narzeka:

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

Wyszukiwanie w internecie, dowiedziałem się, że klasa jest brakuje osprzętu < < i >> operator. Ale to nie jest opcja dla klas wyliczeniowych. Próbowałem nawet użyć

qRegisterMetaType<Foo>("Foo"); 

ale to nie pomogło. Może masz dla mnie inne sugestie/rozwiązania. Dzięki!

Odpowiedz

3

wyliczenia, które są maskowane niepodpisane ints, wydają się być problemem, zobacz

Qt4 QSettings save enumeration value (for example Qt::CheckState)

roztworze tam i prawdopodobnie tutaj byłoby przekształcić go niepodpisany. Aby sprawdzić, czy wynik static_cast z powrotem do wyliczenia jest poprawny, możesz dodać wartości Foo_lowest i Foo_highest na początku i końcu zakresu wyliczeniowego.

+0

Masz rację, to problem z wyliczeniami w QVariants. Moja oryginalna implementacja polegała na zapisaniu rzeczywistych (niepodpisanych) wartości całkowitych w QVariant. Teraz próbowałem wyliczenia, ale wpadłem na ten problem z QVariants. Jednak wróciłem do pierwotnej implementacji z twoją sztuczką najniższych/najwyższych wartości w enumie. Dzięki. – CppChris