c++ - Qt:使用模板函数将作用域枚举转换为字符串

标签 c++ qt

出于记录目的,我想将我的枚举转换为人类可读的字符串。大多数时候我使用范围枚举,因此我需要一个也适用于范围枚举的解决方案。 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/

相关文章:

c++ - 从 .exe 读取输入并写入 .exe 以读取国际象棋引擎命令

c++ - 使用智能指针作为 Qt 标准函数的参数

c++ - qt 和 ffmpeg - 未定义引用

c++ - 如何设置 QWidget 全屏(但 "real"全屏,更改分辨率,将模态设置为整个系统)?

css - Qt css背景半透明

c++ - 将删除与基类指针一起使用会导致内存泄漏吗?

c++ - 类包含其他类问题的字段

c++ - 替换对象 vector 的元素

c++ - 不正确的极坐标 - 笛卡尔坐标转换。 -0 是什么意思?

qt - QT 4.8.5 中没有找到 QWebFrame、QWebPage 和 QWebview?