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++ - 使用 mysql++ 库时出现问题

c++ - 迭代子类列表错误

java - TopCoder 最佳选择算法来自 SRM 489 DIV 2(500 分)

c++ - 带有网络摄像头 c930e 罗技的 OpenCv

c++ - 有哪些具有快速附加和随机访问功能的可移植数据后端?

c++ - QTableView 中标题单元格中的复选框

python - 在 PyQt 中设置 QGraphicsTextItem 来源

c++ - 如何修复 OpenCV 段错误?

c++ - 折叠表达式作为 [] 运算符的参数

c++ - Qt:使用uic生成ui_类,通过类名动态加载