[英]How to convert enum to QString?
我正在尝试使用 Qt 反射将枚举转换为 QString。
这是代码的一部分:
class ModelApple
{
Q_GADGET
Q_ENUMS(AppleType)
public:
enum AppleType {
Big,
Small
}
}
这是我尝试做的:
convertEnumToQString(ModelApple::Big)
回归"Big"
这可能吗? 如果您对convertEnumToQString
有任何想法,请分享
您需要使用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));
}
在强大的 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);
};
我创建了一个小部件应用程序,在那里调用 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;
}
很抱歉反向转换,我在某些项目中尝试成功,但这次我遇到了编译错误。 所以我决定从我的答案中删除它。
以下应该让你开始:
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));
}
怎么样:
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,请参阅此答案
我遇到了同样的问题,这就是我解决它的方法。 这尤其适用于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);
}
对于全局 Enum 声明,请在任何头文件中使用它:
namespace YourNamespace {
Q_NAMESPACE
enum YourEnum: int {
EnumValue1,
EnumValue2
};
Q_ENUM_NS(YourEnum)
}
这是您想要获得 Enum 描述的地方:
QMetaEnum metaEnum = QMetaEnum::fromType<YourEnum>();
qDebug() << "Enum description: " << metaEnum.name() << "::" << metaEnum.valueToKey(YourEnum::EnumValue2);
这是一种不使用Q_ENUM宏的方法
#define Enum2QStr(x) (QString(#x).split(“::”).at(1))
Pro:您的枚举不需要插入任何类(不需要Q_OBJECT成员或Q_ENUM)
缺点:不能与变量一起使用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.