QVariant::fromValue(...) aus enum

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

QVariant::fromValue(...) aus enum

Beitrag von bobcat » 24. Januar 2018 12:09

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.)

hilefoks
Beiträge: 141
Registriert: 13. März 2008 17:09

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

Beitrag von hilefoks » 24. Januar 2018 14:31

Du verwendest Q_DECLARE_METATYPE, solltest für das enum aber Q_ENUM verwenden.

CKassiopaia
Beiträge: 38
Registriert: 21. April 2009 16:42

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

Beitrag von CKassiopaia » 27. Januar 2018 15:31

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ß

Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

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

Beitrag von Christian81 » 27. Januar 2018 17:37

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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

Antworten