浏览QML文档时,我发现了这个值得赞扬的记录类:ItemSelectionModel
C ++类QItemSelectionModel
提供了更多详细信息,目的是跟踪模型中项目的选择。
但是在QML方面,我没有关于如何使用它的线索。
可以说,我有这个ListModel
ListModel {
id: lm
ListElement { value: 0 }
ListElement { value: 0 }
ListElement { value: 0 }
ListElement { value: 0 }
ListElement { value: 1 }
ListElement { value: 1 }
ListElement { value: 2 }
ListElement { value: 2 }
ListElement { value: 0 }
ListElement { value: 0 }
ListElement { value: 2 }
ListElement { value: 2 }
}
现在,我有一个
View
,其中显示了所有该模型,还有另一个视图,其中仅想显示它的选择。因此,我创建了一个ItemSelectionModel
并从第一个视图的代表那里调用了它的select
方法,这似乎根本没有效果。甚至hasSelection
属性都不会改变。Repeater {
model: lm
delegate: Rectangle {
property int row: Math.floor(index / 4)
property int column: index % 4
width: 100
height: 100
x: 100 * column
y: 100 * row
border.color: 'black'
MouseArea {
anchors.fill: parent
onClicked: {
ism.select(index, ItemSelectionModel.Select | ItemSelectionModel.Current)
console.log(ism.hasSelection)
}
}
}
}
ItemSelectionModel {
id: ism
model: lm
}
所以我想知道这个组件的目的是什么,它似乎什么也没做。或者,我怎样才能使其有目的地做某事?
最佳答案
该文档确实根本没有帮助。抱歉,我filed a bug要研究修复它。
在QML世界中,它应该实现与QItemSelectionModel
相同的功能(即,使多个视图的选择状态保持同步)-实际上,QML中的实现是直接实例化的,并且调用实际上与QItemSelectionModel
相同的。
这实际上可能是您麻烦的根源,因为QML的视图不使用QModelIndex
(QItemSelectionModel
要求),而是使用int index
引用模型的行号。要获取QModelIndex
,可以调用QAbstractItemModel::index
,如下所示:
onClicked: {
// note: lm here is the id of your ListModel
ism.select(lm.index(index, 0), ItemSelectionModel.Select | ItemSelectionModel.Current)
console.log(ism.selectedIndexes)
console.log(ism.hasSelection)
}