У меня есть древовидное представление в qml, режим выбора — ExtendedSelection. Всякий раз, когда выбранный индекс изменяется пользователем, мне нужно точно знать, какие строки дерева выбраны. Вот TreeView:
Controls.TreeView {
id: myTreeView
Controls.TableViewColumn {
title: "Name"
role: "name"
}
headerVisible: false
anchors.fill: parent
selection: ItemSelectionModel {
onCurrentIndexChanged: {
console.log(myTreeView.selection.selectedRows(0))
console.log(currentIndex)
}
}
selectionMode: Controls.SelectionMode.ExtendedSelection
onDoubleClicked: {
if (isExpanded(index))
collapse(index);
else
expand(index);
}
}
В приведенном выше примере я просто пытаюсь вывести выбранные строки на консоль, чтобы убедиться, что у меня правильный выбор. currentIndex
всегда содержит последний выбранный индекс (как и ожидалось), но selection.selectedRows()
, который должен содержать все выбранные в данный момент строки, всегда отстает на один шаг. Например:
если пользователь (удерживая Ctrl) выбирает строки 1, 2, 3
одну за другой, selection.selectedRows()
будет null, "1", "1,2"
, а currentIndex
будет 1, 2, 3
соответственно. Объединив эти два параметра вместе, можно получить список всех индексов, находящихся в выбранном состоянии. Моя проблема в том, что если пользователь отпустит Ctrl и выберет строку 4
, то selection.selectedRows()
будет "1,2,3"
, хотя должно быть null
. Подводя итог, невозможно провести различие между случаем, когда пользователь выбирает (удерживая Ctrl) строки 1,2,3,4
, и случаем, когда пользователь сначала выбирает строки (удерживая Ctrl) 1,2,3
, а затем отпускает Ctrl и просто выбирает строку 4
.
Я также тестировал с myTreeView.selection.selectedIndexes
, но все равно такое же поведение. Для меня это похоже на ошибку в TreeView, пожалуйста, посоветуйте, как решить.
Спасибо.