How to convert enum to QString?

后端 未结 6 1114
庸人自扰
庸人自扰 2020-12-08 06:38

I am trying to use the Qt reflection for converting enum to QString.

Here is the part of code:

class ModelApple
{
    Q_GADGET
    Q_ENUMS(AppleType)         


        
相关标签:
6条回答
  • 2020-12-08 07:10

    Much more elegant way found (Qt 5.9), just one single line, with the help of mighty QVariant.

    turns enum into string:

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

    Perhaps you don't need QMetaEnum anymore.

    Sample code here:

    ModelApple (no need to claim Q_DECLARE_METATYE)

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

    And I create a widget application, calling QVaraint function there :

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

    You can see that i try to output the string on console , which really did:

    And sorry for reverse casting , i tried successfully in some project , but some how this time i met compiling error. So i decide to remove it from my answer.

    0 讨论(0)
  • 2020-12-08 07:10

    The following should get you going:

    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));
    }
    
    0 讨论(0)
  • 2020-12-08 07:19

    How about:

    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: For Qt 5.5, see this answer

    0 讨论(0)
  • 2020-12-08 07:26

    You need to use Q_ENUM macro, which registers an enum type with the meta-object system.

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

    And now you can use the QMetaEnum class to access meta-data about an enumerator.

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

    Here is a generic template for such utility:

    template<typename QEnum>
    std::string QtEnumToString (const QEnum value)
    {
      return std::string(QMetaEnum::fromType<QEnum>().valueToKey(value));
    }
    
    0 讨论(0)
  • 2020-12-08 07:28

    For the global Enum declaring use this in any header file:

    namespace YourNamespace {
    
    Q_NAMESPACE
    
    enum YourEnum: int {
    
        EnumValue1,
        EnumValue2
    };
    Q_ENUM_NS(YourEnum)
    
    }
    

    and this where you want to get Enum description:

    QMetaEnum metaEnum = QMetaEnum::fromType<YourEnum>();
    qDebug() << "Enum description: " << metaEnum.name() << "::" << metaEnum.valueToKey(YourEnum::EnumValue2);
    
    0 讨论(0)
  • 2020-12-08 07:34

    I faced the same problem and this is how i solved it. This is especially for 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);
    }
    
    0 讨论(0)
提交回复
热议问题