如何将枚举的Qlist从C ++公开到QML?

时间:2017-02-18 11:53:51

标签: c++ qt enums qml qqmllistproperty

我有一个c ++中的错误列表,我想将它暴露给QML。枚举使用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");

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

在QML中我使用该类:

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

,输出为:

QQmlListProperty

有什么问题?!
如何将我的枚举列表公开给qml?

对于{{1}}文档说:

  

注意:QQmlListProperty只能用于QObject派生的列表   对象指针。

1 个答案:

答案 0 :(得分:4)

正如您所看到的hereQList仅支持一组有限的类型(intqreal等)。有关详细信息,请参阅序列类型到JavaScript数组部分 您应该使用QVariantList代替您的目的。它直接映射到JavaScript Array。有关详细信息,请参阅 QVariantList和QVariantMap到JavaScript数组和对象部分。
另请注意明确提及:

  

其他序列类型不是透明支持的,而是任何其他序列类型的实例将作为不透明的QVariantList在QML和C ++之间传递。

当然,您仍然可以在内部使用QList<LoginErrorCode>,但只要您想在QML环境中退回,就需要转换为QVariantList