Как выставить Qlist перечислений из C++ в QML?

У меня есть список ошибок в C++, и я хочу представить его в QML. Enum зарегистрирован с помощью Q_ENUM и собственность зарегистрирована с помощью Q_PROPERTY, Вы можете увидеть детали ниже:

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QList<LoginErrorCode> loginErrors READ getLoginErrors NOTIFY loginErrorsChanged)
    ...

public:
    ...
    enum LoginErrorCode {
        UsernameOrPassIsNotValid
    };
    Q_ENUM(LoginErrorCode)
    enum GetUserInfoErrorCode {
        GetUserInfoError_TokenIsNotValid
    };
    Q_ENUM(GetUserInfoErrorCode)

    QList<LoginErrorCode> getLoginErrors() const;
    ...
signals:
    ...
    void loginFailed();
    ...
    void loginErrorsChanged();
    ...
private:
    QList<LoginErrorCode> m_loginErrors;
};

и я зарегистрировался MyClass используя следующую строку в main.cpp:

qmlRegisterType<MyClass>("ir.MyComponents", 1, 0, "MyClass");

и в QML я использовал этот класс, используя:

MyClass {
    id: myClass
    Component.onCompleted: login("irani", "iravani");
    onLoginFailed: console.log("Login failed with errors count: "+loginErrors.length);
}

и вывод:

QMetaProperty::read: Unable to handle unregistered datatype 'QList<LoginErrorCode>' for property 'MyClass::loginErrors'
qrc:/main.qml:46: TypeError: Cannot read property 'length' of undefined

В чем проблема?!
Как я могу представить свой список перечислений в qml?
За QQmlListProperty Документация гласит:

Примечание. QQmlListProperty можно использовать только для списков указателей объектов, полученных из QObject.

1 ответ

Решение

Как видно из документации, QList поддерживается только для ограниченного набора типов (int, qreal, и так далее). See section Тип последовательности для массива JavaScript для получения дополнительной информации.
Вы должны использовать QVariantList для ваших целей вместо. Это напрямую сопоставлено с JavaScript Array, Смотрите раздел QVariantList и QVariantMap для JavaScript Array и Object для получения более подробной информации.
Обратите внимание также на явное упоминание:

Другие типы последовательностей не поддерживаются прозрачно, и вместо этого экземпляр любого другого типа последовательности будет передаваться между QML и C++ как непрозрачный QVariantList.

Конечно, вы все еще можете использовать QList<LoginErrorCode> внутренне, но преобразование в QVariantList требуется всякий раз, когда вы хотите вернуть его в среде QML.

Другие вопросы по тегам