带有 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)
}
}
查看两种信号的工作原理。
我在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)
}
}
查看两种信号的工作原理。