Comment convertir en enum en QString?

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

Voici la partie du code:

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

Et voici ce que je veux faire:

convertEnumToQString(ModelApple::Big)

Retour "Big"

Est-ce possible? Si vous avez une idée à ce sujet convertEnumToQString, s'il vous plaît partager

23
demandé sur aurelien 2015-12-15 08:23:48

6 réponses

Vous devez utiliser Q_ENUM macro, qui enregistre un type enum avec le système meta-object.

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

Et maintenant, vous pouvez utiliser le QMetaEnum classe pour accéder aux méta-données sur un recenseur.

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

Ici est un modèle générique pour un tel utilitaire:

template<typename QEnum>
std::string QtEnumToString (const QEnum value)
{
  return std::string(QMetaEnum::fromType<QEnum>().valueToKey(value));
}
40
répondu Meefte 2017-11-10 09:13:31

ce qui suit devrait vous aller à:

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
répondu The Badger 2015-12-15 06:32:10

Beaucoup plus élégant trouvé (Qt 5.9), une seule ligne, avec l'aide de puissants QVariant.

transforme enum en string:

QString theBig = QVariant::fromValue(ModelApple::Big).value<QString>();

peut-être que vous n'avez plus besoin de QMetaEnum.

Exemple de code ici:

ModelApple (no need to claim Q_DCLARE_METATYE)

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

Et j'ai créer un widget de l'application, l'appel de QVaraint fonction :

#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).value<QString>();
    qDebug() << s;

}

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

Vous pouvez voir que j'ai essayer de la chaîne de sortie sur console , qui a vraiment: enter image description here

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

6
répondu Ju-Hsien Lai 2017-11-21 16:02:23

Que Diriez-vous de:

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

mise à jour: pour Qt 5.5, voir cette réponse

2
répondu Danh 2017-05-23 12:34:40

j'ai connu le même problème et c'est comment je l'ai résolu. C'est surtout 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);
}
1
répondu secretgenes 2017-06-20 13:09:39

voici un moyen sans utiliser la macro Q_ENUM

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

Pro: votre enum n'a pas besoin d'être insde n'importe quelle classe (pas de membre Q_OBJECT ou q_enum demandé)

contre: ne peut pas être utilisé avec une variable

0
répondu Moia 2018-05-18 15:10:12