Seite 1 von 1

QVariant::fromValue(...) aus enum

Verfasst: 24. Januar 2018 11:09
von bobcat
Ich habe einen Wert aus einem enum, den ich mittels QVariant::fromValue(...) in einem QVariant unterbringen möchte.

Der Hintergrund ist folgender: Ich befülle eine QComboBox mit meinem enum, so dass als Text ein Alias für den enum-Wert angezeigt wird, und als itemData möchte ich den enum-Wert hinterlegen. Später möchte ich in der QComboBox wieder nach meinem enum-Wert suchen (mit findData(...)), um die QComboBox auf den entsprechenden Index zu setzen, bei dem der enum-Wert vorliegt.

Mein Code sieht folgendermaßen aus:

Code: Alles auswählen

enum MyEnum
{
    EnumNone,
    EnumValue1,
    EnumValue2
}
...
Q_DECLARE_METATYPE(MyClass::MyEnum)
...
QVariant var = QVariant::fromValue(MyClass::EnumValue2);
...
// Inhalt anzeigen mit qDebug ...
qDebug() << var;
// ... liefert folgende Ausgabe
// QVariant(MyClass::MyEnum, )

Der QVariant scheint also auf dem korrekten Typ zu arbeiten, aber leer zu sein. Versteht ihr das?

(Meine eigentliche Aufgabe mit der QComboBox kann ich wohl lösen, indem ich den enum als Integer-Wert in den QVariant verpacke, aber mich würde sehr interessieren, weshalb das Verpacken als enum-Wert anscheinend nicht klappt.)

Re: QVariant::fromValue(...) aus enum

Verfasst: 24. Januar 2018 13:31
von hilefoks
Du verwendest Q_DECLARE_METATYPE, solltest für das enum aber Q_ENUM verwenden.

Re: QVariant::fromValue(...) aus enum

Verfasst: 27. Januar 2018 14:31
von CKassiopaia
Hallo zusammen,

ich stehe gerade vor einem ähnlichen Problem. Vielleicht kann mir dazu jemand eine Lösung geben. Vielleicht suche ich aber auch an der falschen Stelle.

Ich mache mit qDebug() ausgaben auf der Console. Diese werden ja auch direkt von Qt formatiert ausgegeben, so dass z.B. ENUM-Werte als Klartext stehen.

Ich möchte die selbe Ausgabe nun in einem QString haben.

Beispiel:

Code: Alles auswählen

qDebug() << socket->state();
Ergibt als Ausgabe

Code: Alles auswählen

QAbstractSocket::BoundState
Nun habe ich schon folgendes Gefunden, was auch Grundsätzlich funktioniert:

Code: Alles auswählen

QVariant::fromValue(socket->state()).value<QString>()
Allerdings ist hier die Ausgabe nur

Code: Alles auswählen

BoundState
Wie bekomme ich das fehlende "QAbstractSocket::"?

Oder noch einfacher: Wie kann ich direkt die Formatierung von qDebug() in ein QString schreiben? (Also ohne einen separaten MsgHandler?

Vielen Dank und Gruß

Re: QVariant::fromValue(...) aus enum

Verfasst: 27. Januar 2018 16:37
von Christian81
Da diese Ausgabe nur für qDebug() gedacht war - nicht so ohne weiteres. Du kannst natürlich einfach die Implementation für qDebug() für Dich reimplementieren:

Code: Alles auswählen

template <typename T>
QDebug operator<<(QDebug dbg, T enumValue)
{
    const QMetaObject *mo = qt_getEnumMetaObject(enumValue);
    int enumIdx = mo->indexOfEnumerator(qt_getEnumName(enumValue));
    return dbg << mo->enumerator(enumIdx).valueToKey(enumValue);
}
Aber eigentlich müsste auch QMetaEnum::fromType() funktionieren - sollte etwas kürzer ausfallen, macht aber das Gleiche