Qt: Преобразовать enum из области видимости в строку, используя функцию шаблона - PullRequest
3 голосов
/ 15 мая 2019

Для целей регистрации я хочу преобразовать мои перечисления в удобочитаемые строки.Большую часть времени я использую перечисления с ограничением, поэтому мне нужно решение, которое также работает с перечислениями с ограничением.Qt предоставляет макрос Q_ENUM, чтобы избавить меня от лишней работы.Для преобразования перечисления в строку я могу написать:

QMetaEnum::fromType<Class::Enum>().valueToKey(int(enum))

Явное приведение к int необходимо для преобразования enum с областью видимости в 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"

1 Ответ

1 голос
/ 15 мая 2019

Хорошо, я понял.

Решение состоит в том, чтобы не использовать enum с областью действия в макросе Q_ENUM.

Неправильно:

Q_ENUM(Class::Enum)

Правильно:

Q_ENUM(Enum)

В большинстве случаев использование формы с ограничением или без области действия эквивалентно (когда вы находитесь внутри класса).Обычно я всегда использую ограниченную форму, даже внутри класса, чтобы быть ясно, что я хочу сказать.Но кажется, что использование перечисления enoped непосредственно в макросе нарушает функциональность макроса.

Возможно, кто-то с более глубоким знанием Qt сможет объяснить, почему это так.Но я просто помню, что использование формы макроса в макросе делает ее неработоспособной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...