QML 中 ItemSelectionModel 的用途和用法
Posted
技术标签:
【中文标题】QML 中 ItemSelectionModel 的用途和用法【英文标题】:Purpose and usage of ItemSelectionModel in QML 【发布时间】:2017-01-10 10:02:40 【问题描述】:在浏览 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
-property 也懒得改变。
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
所以我想知道这个组件的目的是什么,它似乎什么也没做。或者,我怎样才能让它做一些有目的的事情?
【问题讨论】:
【参考方案1】:文档确实没有任何帮助。很抱歉,我已经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)
【讨论】:
感谢您指出index()
和(通过代理)QAbstractItemModel
的其他未记录的Q_INVOKABLE
s!
使用 onClicked 处理程序不适用于 TreeView (QCC2),因为它禁用了用鼠标导航树的能力(即使传播鼠标事件并将接受设置为 false)。但是挂钩到当前项目的 onchanged 事件是可行的。以上是关于QML 中 ItemSelectionModel 的用途和用法的主要内容,如果未能解决你的问题,请参考以下文章
PySide2 QML - 如何在另一个 QML 文件中引用 QML 文件作为组件?
如何在 Cascades、Blackberry 10 中使用 Qt/QML/C++ 从另一个 qml 文件中更改一个 qml 文件中的标签文本?