Не удается получить доступ к данным QAbstractListModel в ListView

я имею Foo класс, который является производным от QAbstractListModel, А также Bar класс, который я регистрирую и создаю в qml. Бар класс держит 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

0

Решение

Движок QML правильный, modelData не определено. Внутри делегата, model определяется не modelData,

Кроме того, так как в вашем QAbstractListModel Вы не определили свой собственный роли, вы можете использовать по умолчанию роли. display это роль по умолчанию, вы можете использовать ее. Так что ваши ListView должен выглядеть так:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]