浏览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的视图不使用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)
}

07-28 01:31
查看更多