我试图使用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)
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)
抱歉反向投射,我在一些项目中成功尝试过,但有些时候我遇到了编译错误.所以我决定将其从我的答案中删除.
以下内容应该让你前进:
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)
对于全局枚举声明,请在任何头文件中使用它:
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)