web-dev-qa-db-fra.com

Comment convertir enum en QString?

J'essaie d'utiliser la réflexion Qt pour convertir enum en QString.

Voici la partie de code:

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

Et voici ce que j'essaie de faire:

convertEnumToQString(ModelApple::Big)

Retourne "Big"

Est-ce possible? Si vous avez une idée de convertEnumToQString, merci de la partager

23
Jiu

Vous devez utiliser Q_ENUM macro, qui enregistre un type enum avec le système de méta-objets. 

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

Et maintenant, vous pouvez utiliser la classe QMetaEnum pour accéder aux métadonnées sur un énumérateur.

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

Voici un modèle générique pour cet utilitaire:

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

Ce qui suit devrait vous aider:

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

Manière beaucoup plus élégante trouvée (Qt 5.9), juste une seule ligne, avec l'aide de QVariant.

transforme l'énumération en chaîne:

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

Peut-être que vous n’avez plus besoin de QMetaEnum.

Exemple de code ici:

ModelApple (inutile de réclamer Q_DECLARE_METATYE)

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

Et je crée une application de widget, appelant la fonction QVaraint à cet endroit: 

#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;
}

Vous pouvez voir que j’essaie d’afficher la chaîne sur la console, ce qui l’a réellement fait:  enter image description here

Et désolé pour le reverse casting, j’ai essayé avec succès dans certains projets, mais certains comment cette fois j’ai rencontré une erreur de compilation. Je décide donc de le supprimer de ma réponse.

8
Ju-Hsien Lai

Que diriez-vous:

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

UPDATED: Pour Qt 5.5, voir cette réponse

2
Danh

J'ai rencontré le même problème et voici comment je l'ai résolu. Ceci est spécialement pour 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

Voici un moyen de ne pas utiliser la macro Q_ENUM

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

Pro: votre enum n'a pas besoin d'être inséré dans une classe (aucun membre Q_OBJECT ou Q_ENUM demandé)

Contre: Ne peut pas être utilisé avec une variable

0
Moia