it-swarm.com.de

Wie konvertiere ich enum nach QString?

Ich versuche, die Qt-Reflektion zum Konvertieren von enum in QString zu verwenden.

Hier ist der Teil des Codes:

class ModelApple
{
    Q_GADGET
    Q_ENUMS(AppleType)
public:
    enum AppleType {
      Big,
      Small
    }
}

Und hier versuche ich zu tun:

convertEnumToQString(ModelApple::Big)

"Big" zurückgeben

Ist das möglich? Wenn Sie eine Idee zu convertEnumToQString haben, teilen Sie diese bitte mit

23
Jiu

Sie müssen Q_ENUM macro verwenden, das einen Aufzählungstyp im Metaobjektsystem registriert. 

enum AppleType {
  Big,
  Small
};
Q_ENUM(AppleType)

Jetzt können Sie die Klasse QMetaEnum verwenden, um auf Metadaten eines Enumerators zuzugreifen.

QMetaEnum metaEnum = QMetaEnum::fromType<ModelApple::AppleType>();
qDebug() << metaEnum.valueToKey(ModelApple::Big);

Hier ist eine generische Vorlage für ein solches Dienstprogramm:

template<typename QEnum>
std::string QtEnumToString (const QEnum value)
{
  return std::string(QMetaEnum::fromType<QEnum>().valueToKey(value));
}
44
Meefte

Folgendes sollte Sie zum Laufen bringen:

QString convertEnumToQString(ModelApple::AppleType type) {
    const QMetaObject metaObject = ModelApple::staticMetaObject;
    int enumIndex = metaObject.indexOfEnumerator("AppleType");
    if(enumIndex == -1) {
        /* The enum does not contain the specified enum */
        return "";
    }
    QMetaEnum en = metaObject.enumerator(enumIndex);
    return QString(en.valueToKey(type));
}
9
The Badger

Ein viel eleganterer Weg (Qt 5.9), nur eine einzige Zeile, mit Hilfe der mächtigen QVariant.

verwandelt die enum in einen String:

QString theBig = QVariant::fromValue(ModelApple::Big).toString();

Vielleicht brauchen Sie QMetaEnum nicht mehr.

Beispielcode hier:

ModelApple (kein Anspruch auf Q_DECLARE_METATYE)

class ModelApple : public QObject
{
    Q_OBJECT
public:
    enum AppleType {
      Big,
      Small
    };
    Q_ENUM(AppleType)
    explicit ModelApple(QObject *parent = nullptr);
};

Und ich erstelle eine Widget-Anwendung und rufe dort die QVaraint-Funktion auf: 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <modelapple.h>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QString s = QVariant::fromValue(ModelApple::Big).toString();
    qDebug() << s;

}

MainWindow::~MainWindow()
{
    delete ui;
}

Sie können sehen, dass ich versuche, die Zeichenfolge auf der Konsole auszugeben, was wirklich getan hat:  enter image description here

Und Entschuldigung für Reverse Casting, ich habe es in einem Projekt erfolgreich versucht, aber wie ich diesmal den Kompilierfehler traf Also entscheide ich mich, es aus meiner Antwort zu streichen.

8
Ju-Hsien Lai

Wie wäre es mit:

QString convertEnumToQString(ModelApple::AppleType type)
{
    const QMetaObject &mo = ModelApple::staticMetaObject;
    int index = mo.indexOfEnumerator("AppleType");
    QMetaEnum metaEnum = mo.enumerator(index);
    return metaEnum.valueToKey(type);
}

AKTUALISIERT: Zu Qt 5.5 siehe diese Antwort

2
Danh

Ich hatte das gleiche Problem und so habe ich es gelöst. Dies gilt insbesondere für Qt 4,8

QString string = enumToString(ModelApple::Big);

QString ModelApple::enumToString(AppleType Apple)
{
    int index = metaObject()->indexOfEnumerator("AppleType");
    QMetaEnum metaEnum = metaObject()->enumerator(index);
    return metaEnum.valueToKey(Apple);
}
2
secretgenes

Hier ist eine Möglichkeit, ohne das Makro Q_ENUM zu verwenden

#define Enum2QStr(x) (QString(#x).split(“::”).at(1))

Pro: Ihre Enum muss nicht in einer Klasse sein (kein Q_OBJECT-Member oder Q_ENUM angefordert)

Nachteile: Kann nicht mit einer Variablen verwendet werden

0
Moia