出于记录目的,我想将枚举转换为人类可读的字符串。大多数情况下,我使用范围枚举,因此我需要一种适用于范围枚举的解决方案。 Qt提供了Q_ENUM宏,以确保我的工作安全。要将枚举转换为字符串,我可以这样写:
QMetaEnum::fromType<Class::Enum>().valueToKey(int(enum))
必须将显式强制转换为int才能将作用域枚举转换为int,因为valueToKey
必须使用整数值进行调用。这适用于作用域枚举,但我想使用某种模板函数进行转换。我在另一个问题中找到了以下模板解决方案:
template<typename QEnum>
QString enumToString (QEnum value)
{
return QMetaEnum::fromType<QEnum>().valueToKey(int(value));
}
但是,这不适用于作用域枚举。有没有适用于普通AND范围枚举的模板解决方案?
示例:
class LoggingManager : public QObject
{
Q_OBJECT
public:
enum class Level
{
debug,
info,
warning,
error,
fatal
};
Q_ENUM(LoggingManager::Level)
enum Category
{
network,
usb
};
Q_ENUM(Category)
...
}
QString level = enumToString(LoggingManager::Level::debug) // ""
QString level2 = QMetaEnum::fromType<LoggingManager::Level>().valueToKey(int(LoggingManager::Level::debug)) // "debug"
QString category = enumToString(LoggingManager::usb) // "usb"
答案 0 :(得分:1)
好的,我知道了。
解决方案是不使用Q_ENUM
宏中的作用域枚举。
错误:
Q_ENUM(Class::Enum)
正确:
Q_ENUM(Enum)
在大多数情况下,使用范围或非范围形式是等效的(当您在类内时)。通常,即使在类内部,我也总是使用范围限定的形式,只是要清楚我想说什么。但是似乎直接在宏中使用作用域枚举会破坏宏的功能。
也许对Qt有更深了解的人可以解释为什么会这样。但是我只记得在宏中使用作用域形式会使其损坏。