Qt的文档在这个问题上似乎有点简短,但我正在尝试使用QLists作为ListView的模型。 问题是,我代表一个层次结构,只要点击一个项目,模型就会与另一个项目交换,QML将从C ++回调中获取。
这是表示列表项的对象:
class MyObject : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ getName WRITE setName)
Q_PROPERTY(QString subtitle READ getSubtitle)
Q_PROPERTY(QList<QObject*> descent READ getChildren NOTIFY childrenUpdated)
...
}
我在QML中如何使用它:
ListView {
id: list_view
model: myModel
anchors.fill: parent
delegate: Item {
id: row
height: 50
anchors.left: parent.left
anchors.right: parent.right
MouseArea {
anchors.fill: row
onClicked: {
list_view.model = descent;
}
}
Column {
Text { text: name }
Text { text: subtitle }
}
}
}
“myModel”模型在main中设置,如下所示:
context->setContextProperty("myModel", QVariant::fromValue(folder.getChildren()));
第一次出现ListView时,它使用myModel作为模型,它可以工作。 但是,每当我点击某个项目时,ListView会创建预期的确切项目数...但它无法读取任何属性!
为什么ListView确切地知道需要创建多少项目,但却看不到它们的属性?
答案 0 :(得分:5)
我相信这是你正在观察的正确行为。 QML知道QList
中的元素数量,但就查询name
和subtitle
而言,这是不可能的,因为descent
不符合{ListView::model
的约束1}}
来自ListView::model property的QML文档:
该模型提供用于创建项目的数据集 风景。可以使用ListModel直接在QML中创建模型, XmlListModel或VisualItemModel,或由C ++模型类提供。如果 使用C ++模型类,它必须是QAbstractItemModel的子类 或简单的清单。
因此,在这方面,您必须将descent
更改为一个简单的列表,我认为这意味着包含简单数据,例如单个QString
,int
等。 ..或将其实现为QAbstractItemModel
,其中包含您的QObjects
。