Сохраните переменную класса enum в JSON - PullRequest
0 голосов
/ 02 марта 2019

Я хочу сохранить некоторую информацию в формате JSON.
Рассмотрим следующий фрагмент кода.У меня есть ошибка в методе save(), где переменная типа enum class назначена как QJsonValue.

Как я могу использовать enum class в этой ситуации?
Спасибо

class MyClass : public QObject
{
    Q_OBJECT

public:
    enum class Status { Undefined, S1, S2 };
    Q_ENUM(Status)

    explicit MyClass(QObject *parent = nullptr);

    void save(QString filename) {
        //...
        QJsonObject jsonObj;
        jsonObj["id"] = m_id;
        jsonObj["status"] = m_status;   //<-- Error: no known conversion from 'MyClass::Status' to 'const QJsonValue' for 1st argument
        //...

        //Save QJsonDocument into target file
    }

private:
    QString m_id;
    MyClass::Status m_status;
    //...
};

Примечание: Если я заменю enum class на старую enumэтот код будет работать нормально.Но с enum class он не будет скомпилирован.

Подробнее: См. JSON Save Game Example в источнике Qt.Он имеет класс с именем Character и традиционный enum с именем ClassType.Попробуйте изменить enum на enum class.Это не будет работать.Как заставить это работать?

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Вы можете преобразовать enum class в QVariant и присвоить его QJsonValue:

jsonObj["status"] = QVariant::fromValue(m_status).toJsonValue();
0 голосов
/ 02 марта 2019

Отсюда: https://en.cppreference.com/w/cpp/language/enum

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

Так что это должно работать:

class MyClass : public QObject
{
    Q_OBJECT

public:
    enum class Status { Undefined, S1, S2 };
    Q_ENUM(Status)

    explicit MyClass(QObject *parent = nullptr);

    void save(QString filename) {
        //...
        QJsonObject jsonObj;
        jsonObj["id"] = m_id;
        jsonObj["status"] = static_cast<int>(m_status);   //<-- Error: no known conversion from 'MyClass::Status' to 'const QJsonValue' for 1st argument
        //...

        //Save QJsonDocument into target file
    }

private:
    QString m_id;
    MyClass::Status m_status;
    //...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...