如何将枚举的Qlist从C 曝光到QML



我在C 中有一个错误列表,我想将其暴露于QML。使用Q_ENUM注册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;
};

,我使用main.cpp中的以下行注册了MyClass

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仅针对有限的类型(intqreal等)支持。有关更多详细信息,请参见序列类型您应该将QVariantList用于您的目的。它直接映射到JavaScript Array。有关更多详细信息请注意,明确提及:

其他序列类型不透明地支持,而其他任何其他序列类型的实例将在qml和c 之间作为不透明的qvariantlist传递。

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

相关内容

  • 没有找到相关文章

最新更新