在浏览QML文档时,我发现了这个值得称赞的文档类:ItemSelectionModel
有C ++ - Class 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
}
所以我想知道这个组件的目的是什么,似乎什么都不做。或者,我怎样才能让它做一些有目的的事情?
答案 0 :(得分:7)
文档确实没有用。很抱歉,我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)
}