好的,所以我设置了一个 QTreeView
和一个从 QAbstractItemModel
子类化的模型。到目前为止一切顺利。
模型的数据每隔固定时间间隔更新一次,例如两秒。为简单起见,假设项目只是短整数,没有层次结构。所有项目都是独一无二的。
t=0:
497
1739
18
125
19
用户选择项目18
:
t=1:
497
1739
[18]
125
19
t=2,元素列表更新变化!
497
18
[1739]
125
例如,1739
和18
现在被调换了,最后的19
消失了。
哎呀! 1739
现在被选中,这似乎是合法的:用户已经选择了第三个项目,即使在更新后它仍然被选中。
我希望问题现在很明显:我需要选择来“跟踪”到底选择了什么项目。使用项目本身的一些内部 ID。因此,如果新列表包含一个与之前选择的项目具有相同 ID 的项目,它将被选中。
我可以在更新时自己更改选择,或者使用 insertRow
和 removeRow
,但我不知 Prop 体是什么(1739
和18
被交换了)在列表中发生了变化,我刚收到一个新的整数列表。
我查看了 QItemSelectionModel
,尽管 Qt 文档说
The QItemSelectionModel class keeps track of a view's selected items.
,它看起来不像我需要的。我认为这是我需要子类化的另一个代理模型,但它不是。
接下来我认为我的模型是编写跟踪选择的代码的正确位置,但我又失败了:模型无法检索 View 的选择模型 (view->selectionModel( )
),因为它无法访问 View 。
我最终可能会在我的模型中编写一些信号和插槽,以便模型外部的代码可以更新选择,加上模型外部连接到 View 的 selectionModel 的插槽更新存储在模型中的当前选定项目的 id等等等等,但是在写这些东西之前我想问问是否已经有一些我不知道的实践。
解释所有这些内容的文档和文章太少了,我自己无法找到上述问题的答案。
谢谢!
最佳答案
最好检测何时从模型中添加/移动/删除项目并发出相应的信号,但这会很复杂,您可能不需要这么复杂的功能。
假设您对单一选择感兴趣,您可以非常简单地做到这一点。当前选择更改时,只需存储所选值。 当您收到模型已更改的通知时,只需找到项目的新位置并更新选择即可。
void onCurrentSelectionChange(const QModelIndex & index) { // slot
selectedValue = index->data(); // update field: QVariant selectedValue
}
void onModelReset() { // slot connected to signal where model reports that it was changed
QModelIndex newSelection = yourModel->findIndexOfValue(selectedValue); // you have to provide such method in your moel
emit newSelection(newSelection); // signal connected to setCurrentIndex slot of QTreeView or selection model
}
如果要处理更复杂的选择会比较麻烦。
关于c++ - 在 TreeView 中进行 "tracking"项选择的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24338037/