QML中ItemSelectionModel的用途和用法

时间:2017-01-10 10:02:40

标签: qt model qml qtquick2

在浏览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
}

所以我想知道这个组件的目的是什么,似乎什么都不做。或者,我怎样才能让它做一些有目的的事情?

1 个答案:

答案 0 :(得分:7)

文档确实没有用。很抱歉,我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)
}