首页 文章

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

提问于
浏览
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;
};

我在 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

What is the problem?! How can I expose my list of enums to qml?
对于 QQmlListProperty 文档说:

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

1 回答

  • 4

    如您所见from the documentation,仅支持一组有限类型的 QListintqreal 等) . 有关更多详细信息,请参阅序列类型到JavaScript数组 .
    您应该使用 QVariantList 代替 . 它直接映射到JavaScript Array . 有关更多详细信息,请参阅QVariantList和QVariantMap到JavaScript Array和Object部分 .
    还要注意明确提到:

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

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

相关问题