У меня есть TreeView
из QFileSystemModel
и ItemSelectionModel
:
ItemSelectionModel {
id: sel
model: fileSystemModel
onSelectedIndexesChanged: {
model.setSelected(selectedIndexes)
}
}
TreeView {
id: view
anchors.fill: parent
sortIndicatorVisible: true
model: fileSystemModel
rootIndex: rootPathIndex
selection: sel
selectionMode: 2
TableViewColumn {
id: namecolumn
title: "Name"
role: "fileName"
resizable: true
width: parent.width-sizeWidth-dateWidth-scrollBarWidth
delegate: mycomp
}
... other columns
}
Когда я сортирую TreeView
по имени или размеру файла, выбор не обновляется. Поэтому в моем fileSystemModel (производном от QFileSystemModel) я создал функцию Q_INVOKABLE
, которая должна хранить выбранные индексы:
Q_INVOKABLE void setSelected(QModelIndexList list) {
_selectedIndices.clear();
for(int i=0;i<list.count();i++) {
_selectedIndices.append(QPersistentModelIndex(list[i]));
}
}
Однако я не уверен, сработает ли это, так как я не уверен, совпадают ли индексы ItemSelectionModel
с модельными индексами.
После сортировки мне показалось, что я пытаюсь установить выделение путем получения этого списка на стороне c ++:
Q_INVOKABLE QVariantList getSelected() {
return static_cast<QVariantList>(_selectedIndices);
}
и в QML
onSortIndicatorOrderChanged: {
var list = model.getSelected())
console.log('new selection:')
for(var idx in list) {
console.log(list[idx])
selection.select(list[idx],ItemSelectionModel.Select)
console.log('now selected')
console.log(selection.selectedIndexes)
}
}
Вывод отладки в onSortIndicatorChanged
показывает
qml: new selection:
qml: QPersistentModelIndex(5,0,0x1e2ad30,DisplayFileSystemModel(0x1544890))
qml: now selected
qml:
sort by column 0
qml: new selection:
qml: QPersistentModelIndex(1,0,0x1e2ad30,DisplayFileSystemModel(0x1544890))
qml: now selected
qml:
если я переключу sortIndicator. Похоже, что строка QPersistentModelIndex
обновляется правильно. Однако selection.selectedIndexes
пусто и выбор не отображается. Чего мне не хватает?
Другим способом (может быть, лучше) было бы получить доступ к QItemSelectionModel непосредственно в c ++, но я не знаю, как я мог бы получить к нему доступ (без поиска его имени объекта, что вредит повторному использованию).