出于记录目的,我想将我的枚举转换为人类可读的字符串。大多数时候我使用范围枚举,因此我需要一个也适用于范围枚举的解决方案。 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));
}
但这不适用于作用域枚举。是否有任何模板解决方案也适用于普通和作用域枚举?
示例:
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"
最佳答案
好吧,我明白了。
解决方案是不在 Q_ENUM
宏中使用作用域枚举。
错误:
Q_ENUM(Class::Enum)
正确:
Q_ENUM(Enum)
对于大多数用例,使用范围或非范围形式是等效的(当您在类中时)。即使在类里面,我通常也总是使用范围形式,只是清楚我想说的内容。但似乎直接在宏中使用作用域枚举会破坏宏的功能。
也许对Qt 有更深入了解的人可以解释为什么会这样。但我只记得在宏中使用范围形式会使它损坏。
关于c++ - Qt:使用模板函数将作用域枚举转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56145901/