[Gelöst] QFlags in QSettings speichern

Alles rund um die Programmierung mit Qt
Antworten
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

[Gelöst] QFlags in QSettings speichern

Beitrag von bobcat »

Hallo,

ich habe QFlags, die ich in QSettings speichern möchte:

Code: Alles auswählen

class MySettings {

enum Level { Level0 = 0x0,
    Level1 = 0x1,
    Level1 = 0x2
};
Q_DECLARE_FLAGS(Levels, Level)

void setLevels(Levels levels);

private:
    QSettings settings;
}
Q_DECLARE_METATYPE(MySettings::Levels)

void MySettings::setLevels(Levels levels) {
    QVariant var;
    var.setValue(levels);
    settings.setValue("someKey", var);
}
Als Fehler bekomme ich

Code: Alles auswählen

ASSERT failure in QVariant::save: "Invalid type to save", file kernel\qvariant.cpp, line 2035
QVariant::save: unable to save type 261.
Ich hatte vermutet, dass es genügt, wenn ich QFlags mit Q_DECLARE_METATYPE() deklariere, um diese in einen QVariant umwandeln zu können, zumindest liest sich die Doku zu Q_DECLARE_METATYPE() so.

Weiß jemand, wie man das richtig macht, d.h., was man machen muss, um QFlags in QSettings speichern zu können?
Zuletzt geändert von bobcat am 21. August 2013 13:06, insgesamt 1-mal geändert.
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

Re: QFlags in QSettings speichern

Beitrag von bobcat »

Ich sehe gerade, dass ich noch

Code: Alles auswählen

qRegisterMetaType<Levels>("Levels");
qRegisterMetaTypeStreamOperators<Levels>("Levels");
und die QDataStream Operatoren definieren muss ... mal sehen, wie weit ich damit komme.
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

Re: QFlags in QSettings speichern

Beitrag von bobcat »

Falls jemand eine gute Idee hat, wie man QFlags in einen QDataStream serialisiert, wäre ich für einen Hinweis dankbar, also für:

Code: Alles auswählen

QDataStream& operator<<(QDataStream& out, const MySettings::Levels& levels)
{
?
}

QDataStream& operator>>(QDataStream& in, MySettings::Levels& levels)
{
?
}
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

Re: QFlags in QSettings speichern

Beitrag von bobcat »

Haha, manchmal ist die Lösung auch zu einfach ... qRegisterMetaType, qRegisterMetaTypeStreamOperators und QDataStream Operatoren braucht man alles nicht ... schließlich gibt's eine Typumwandlung von und nach int:

Code: Alles auswählen

void MySettings::setLevels(Levels levels) {
    settings.setValue("someKey", (int)levels);
}
MySettings::Levels MySettings::levels() {
    int levels = settings.value("someKey", 0).toInt();
    return (Levels)levels;
}
Antworten