У меня есть список ошибок в 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
указатели объектов.
Как вы видете из документации, QList
поддерживается только для ограниченного набора типов (int
, qreal
, и так далее). Смотрите раздел Тип последовательности для массива JavaScript для дальнейших деталей.
Вы должны использовать QVariantList
для ваших целей вместо. Это напрямую сопоставлено с JavaScript Array
, Смотрите раздел QVariantList и QVariantMap для JavaScript-массива и объекта для дальнейших деталей.
Обратите внимание также на явное упоминание:
Другие типы последовательностей не поддерживаются прозрачно, и вместо этого экземпляр любого другого типа последовательности будет передаваться между QML и C ++ как непрозрачный QVariantList.
Конечно, вы все еще можете использовать QList<LoginErrorCode>
внутренне, но преобразование в QVariantList
требуется всякий раз, когда вы хотите вернуть его в среде QML.
Других решений пока нет …