selectedRows() в Qml TreeView с ExtendedSelection на один шаг позади

У меня есть древовидное представление в 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, пожалуйста, посоветуйте, как решить.

Спасибо.


person Ehsan Enayati    schedule 15.09.2016    source источник


Ответы (1)


Вы должны использовать onSelectionChanged вместо onCurrentIndexChanged. С помощью этого сигнала вы можете получить список выбранных индексов.

Я не знаю весь ваш код, но использую браузер файловой системы пример, предоставленный Qt, вы можете проверить разницу.

В этом примере замените

ItemSelectionModel {
  id: sel
  model: fileSystemModel
}

by

ItemSelectionModel {
    id: sel
    model: fileSystemModel
    onSelectionChanged: {
       console.log("onSelectionChanged - selectedRows: " + selectedIndexes)
    }
    onCurrentIndexChanged: {
       console.log("onCurrentIndexChanged - selectedRows: " + selectedIndexes)
    }
}

Чтобы увидеть, как работают оба сигнала.

person Tarod    schedule 16.09.2016