无法访问 ListView 中的 QAbstractListModel 数据
Can't access QAbstractListModel data in ListView
我有 Foo
class 派生自 QAbstractListModel
。和 Bar
class 我在 qml 中注册和创建的。栏 class 包含 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
QML引擎是对的,modelData
没有定义。在委托中,model
的定义不是 modelData
。
此外,由于在您的 QAbstractListModel
中您没有定义自己的 角色 ,您可以使用默认的 角色 。 display
是您可以使用的默认角色。所以,你的 ListView
应该是这样的:
ListView {
id: someList
model: bar.foo
delegate: Text {
text: model.display
}
}
我有 Foo
class 派生自 QAbstractListModel
。和 Bar
class 我在 qml 中注册和创建的。栏 class 包含 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
QML引擎是对的,modelData
没有定义。在委托中,model
的定义不是 modelData
。
此外,由于在您的 QAbstractListModel
中您没有定义自己的 角色 ,您可以使用默认的 角色 。 display
是您可以使用的默认角色。所以,你的 ListView
应该是这样的:
ListView {
id: someList
model: bar.foo
delegate: Text {
text: model.display
}
}