如何将枚举转换为QString?

Jiu*_*Jiu 29 c++ enums qt

我试图使用Qt反射将枚举转换为QString.

这是代码的一部分:

class ModelApple
{
    Q_GADGET
    Q_ENUMS(AppleType)
public:
    enum AppleType {
      Big,
      Small
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我试图做的:

convertEnumToQString(ModelApple::Big)
Run Code Online (Sandbox Code Playgroud)

返回 "Big"

这可能吗?如果您有任何想法convertEnumToQString,请分享

Mee*_*fte 53

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

enum AppleType {
  Big,
  Small
};
Q_ENUM(AppleType)
Run Code Online (Sandbox Code Playgroud)

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

QMetaEnum metaEnum = QMetaEnum::fromType<ModelApple::AppleType>();
qDebug() << metaEnum.valueToKey(ModelApple::Big);
Run Code Online (Sandbox Code Playgroud)

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

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

  • `QMetaEnum :: fromType <T>`可从Qt 5获得,它在Qt 4中不存在.您应该添加此注释.顺便说一句,我不建议使用`QMetaEnum :: key`,因为它将`index`作为参数,为什么他声明`enum AppleType {Big = 2,Small}` (6认同)
  • 从文档来看,它实际上只能从Qt 5.5中获得,因此我仍然需要在我给出的答案中使用我的方法(即将更新我的代码,但现在必须使用Qt 5.4). (4认同)

Ju-*_*Lai 15

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

将枚举转换为字符串:

QString theBig = QVariant::fromValue(ModelApple::Big).toString();
Run Code Online (Sandbox Code Playgroud)

也许你不再需要QMetaEnum了.

示例代码:

ModelApple(无需声明Q_DECLARE_METATYE)

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

我创建了一个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;
}
Run Code Online (Sandbox Code Playgroud)

您可以看到我尝试在控制台上输出字符串,这确实做到了: 在此输入图像描述

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


CJC*_*ink 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));
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*lov 8

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

namespace YourNamespace {

Q_NAMESPACE

enum YourEnum: int {

    EnumValue1,
    EnumValue2
};
Q_ENUM_NS(YourEnum)

}
Run Code Online (Sandbox Code Playgroud)

这是您想要获取枚举描述的地方:

QMetaEnum metaEnum = QMetaEnum::fromType<YourEnum>();
qDebug() << "Enum description: " << metaEnum.name() << "::" << metaEnum.valueToKey(YourEnum::EnumValue2);
Run Code Online (Sandbox Code Playgroud)