Qt 的文档在这个问题上似乎有点短,但我正在尝试使用 QList 作为 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 知道它需要创建多少项,却看不到它们的属性?
最佳答案
我相信这是您观察到的正确行为。 QML 知道 QList
中的元素数量,但就查询它们的 name
和 subtitle
而言,这是不可能的,因为 descent
不符合 ListView::model
来自 ListView::model property 的 QML 文档:
The model provides the set of data that is used to create the items in the view. Models can be created directly in QML using ListModel, XmlListModel or VisualItemModel, or provided by C++ model classes. If a C++ model class is used, it must be a subclass of QAbstractItemModel or a simple list.
所以在这方面,您要么必须将 descent
更改为一个简单的列表,我认为这意味着包含简单的数据,例如单个 QString
、int
等...或将其实现为 QAbstractItemModel
,其中包含您的 QObjects
列表。
关于c++ - QML ListView 使用 QList<QObject*> 作为模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21687629/