2014-04-03 12 views
5

Ho un problema con le classi enum, QVariants e la classe QSettings. Ci sono valori di classe enum che voglio memorizzare in un QVariant che entra in un'istanza di QSettings. Quindi, il mio codice è in realtà qualcosa di simile:classe enum in QVariant in 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)); 

A questo punto eseguire il codice, un'affermazione salta e si lamenta:

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

Cercando su internet, ho scoperto che la classe è manca un raccordo < e >> operatore. Ma questa non è un'opzione per le classi enum. Ho anche provato a usare

qRegisterMetaType<Foo>("Foo"); 

ma non ha aiutato. Forse hai altri suggerimenti/soluzioni per me. Grazie!

risposta

3

enumerazioni, che sono mascherati unsigned int, sembra essere un problema, vedere

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

La soluzione c'è e probabilmente qui sarebbe convertirlo un unsigned. Per verificare se il file static_cast restituisce all'enum è valido, è possibile aggiungere i valori Foo_lowest e Foo_highest all'inizio e alla fine dell'intervallo di enum.

+0

Hai ragione, questo è un problema con le enumerazioni in QVarianti. La mia implementazione originale stava salvando i valori interi (senza segno) effettivi in ​​QVariant. Ora ho provato l'enfasi dell'ambito, ma mi sono imbattuto in questo problema con QVariants. Tuttavia, sono tornato all'implementazione originale con il trucco dei valori più bassi/più alti nell'enum. Grazie. – CppChris