无法访问ListView中的QAbstractListModel数据

时间:2017-10-16 12:56:32

标签: c++ qt qml qabstractlistmodel

我有Foo类派生自QAbstractListModel。和我在qml中注册和创建的Bar类。 Bar类将Foo对象公开为属性。

class Foo : public QAbstractListModel
{
    Q_OBJECT
public:
    explicit Foo(QObject *parent = nullptr) : QAbstractListModel(parent) {
        mList.append("test1");
        mList.append("test2");
        mList.append("test3");
    }

    virtual int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE {
        return mList.count();
    }
    virtual QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE {
        return mList.at(index.row());
    }
private:
    QStringList mList;
};

class Bar : public QQuickItem
{
    Q_OBJECT
    Q_PROPERTY(Foo* foo READ foo NOTIFY fooChanged)

public:
    explicit Bar(QQuickItem *parent = nullptr)
        : QQuickItem(parent) {
        mFoo = new Foo(this);
    }

    Foo *foo() const { return mFoo; }

signals:
    void fooChanged(Foo *foo);

private:
    Foo *mFoo;
};

注册Bar类型:

qmlRegisterType<Bar>("Custom", 1, 0, "Bar");

QML:

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.0
import Custom 1.0

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ListView {
        id: someList
        model: bar.foo
        delegate: Text {
            text: modelData
        }
    }

    Bar {
        id: bar
    }
}

我创建ListView并分配模型Foo。 预期的结果是看到代表文本填写“test1”,“test2”,“test3”,但我明白了:

ReferenceError: modelData is not defined
ReferenceError: modelData is not defined
ReferenceError: modelData is not defined

1 个答案:

答案 0 :(得分:3)

QML引擎是正确的,modelData未定义。在代理中,model的定义不是modelData

此外,由于您的QAbstractListModel未定义自己的角色,因此您可以使用默认的角色display是您可以使用它的默认角色。因此,您的ListView应如下所示:

ListView {
    id: someList
    model: bar.foo
    delegate: Text {
        text: model.display
    }
}