3

我有一个 c++ 错误列表,我想将它公开给 QML。枚举是使用注册的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 派生对象指针的列表。

4

1 回答 1

4

正如您从文档中看到的那样,QList仅支持有限的一组类型(intqreal等)。有关更多详细信息,请参阅JavaScript 数组的序列类型部分。
您应该将QVariantList其用于您的目的。它直接映射到 JavaScript Array。有关详细信息,请参阅QVariantList 和 QVariantMap 到 JavaScript 数组和对象部分。
另请注意明确提及:

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

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

于 2017-02-18T12:11:04.197 回答