带有 ExtendedSelection 的 Qml TreeView 中的 selectedRows() 落后了一步

selectedRows() in Qml TreeView with ExtendedSelection is one step behind

我在qml中有一个treeview,选择模式是ExtendedSelection。每当用户更改所选索引时,我都需要确切地知道选择了哪些树行。这是树视图:

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 中的一个错误,请指教如何解决。

谢谢。

您应该使用 onSelectionChanged 而不是 onCurrentIndexChanged。使用该信号,您可以获得选定索引的列表。

我不知道你的整个代码,但使用 Qt 提供的 File System Browser 示例你可以检查差异。

在那个例子中,替换

ItemSelectionModel {
  id: sel
  model: fileSystemModel
}

来自

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

查看两种信号的工作原理。