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 的视图不使用 QModelIndexQItemSelectionModel 需要),而是使用 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_INVOKABLEs! 使用 onClicked 处理程序不适用于 TreeView (QCC2),因为它禁用了用鼠标导航树的能力(即使传播鼠标事件并将接受设置为 false)。但是挂钩到当前项目的 onchanged 事件是可行的。

以上是关于QML 中 ItemSelectionModel 的用途和用法的主要内容,如果未能解决你的问题,请参考以下文章

PySide2 QML - 如何在另一个 QML 文件中引用 QML 文件作为组件?

C++ 和 QML 中的 QT QML 项

如何在 Cascades、Blackberry 10 中使用 Qt/QML/C++ 从另一个 qml 文件中更改一个 qml 文件中的标签文本?

qml中数组如何操作

无法在 Loader QML 文件中保存 QML 对象

无法访问位于同一目录中的 QML 单例