如何将枚举转换为QString?

时间:2015-12-15 05:23:49

标签: c++ qt enums

我正在尝试使用Qt反射将枚举转换为QString。

以下是代码的一部分:

'0' = 48   - 48 = 0
'1' = 49   - 48 = 1
...
'9' = 57   - 48 = 9

这是我试图做的事情:

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

返回convertEnumToQString(ModelApple::Big)

这可能吗? 如果您对"Big"有任何疑问,请分享

7 个答案:

答案 0 :(得分:47)

您需要使用Q_ENUM宏,它将枚举类型注册到元对象系统。

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

现在您可以使用QMetaEnum类来访问有关枚举数的元数据。

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

以下是此类实用程序的通用模板:

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

答案 1 :(得分:11)

在强大的QVariant的帮助下,找到了更优雅的方式(Qt 5.9),只有一条线。

将枚举变为字符串:

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

也许你不再需要QMetaEnum了。

示例代码:

ModelApple(无需声明Q_DECLARE_METATYE)

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

我创建了一个widget应用程序,在那里调用QVaraint函数:

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

你可以看到我尝试在控制台上输出字符串,这确实是: enter image description here

抱歉反向投射,我在一些项目中成功尝试过,但有些时候我遇到了编译错误。所以我决定将其从我的答案中删除。

答案 2 :(得分:9)

以下内容可以帮助您:

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

答案 3 :(得分:2)

怎么样:

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

更新:对于Qt 5.5,请参阅this answer

答案 4 :(得分:2)

我遇到了同样的问题,这就是我解决它的方法。这尤其适用于 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);
}

答案 5 :(得分:1)

对于声明的全局枚举,请在任何头文件中使用:

namespace YourNamespace {

Q_NAMESPACE

enum YourEnum: int {

    EnumValue1,
    EnumValue2
};
Q_ENUM_NS(YourEnum)

}

以及要在其中获取枚举说明的位置:

QMetaEnum metaEnum = QMetaEnum::fromType<YourEnum>();
qDebug() << "Enum description: " << metaEnum.name() << "::" << metaEnum.valueToKey(YourEnum::EnumValue2);

答案 6 :(得分:0)

这是一种不使用Q_ENUM宏的方法

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

Pro:你的枚举不需要任何课程(没有Q_OBJECT成员或Q_ENUM要求)

缺点:不能与变量一起使用