gpt4 book ai didi

c++ - 在 TreeView 中进行 "tracking"项选择的最简单方法?

转载 作者:太空狗 更新时间:2023-10-29 23:03:51 27 4
gpt4 key购买 nike

好的,所以我设置了一个 QTreeView 和一个从 QAbstractItemModel 子类化的模型。到目前为止一切顺利。

模型的数据每隔固定时间间隔更新一次,例如两秒。为简单起见,假设项目只是短整数,没有层次结构。所有项目都是独一无二的

t=0:

497
1739
18
125
19

用户选择项目18:

t=1:

497
1739
[18]
125
19

t=2,元素列表更新变化!

497
18
[1739]
125

例如,173918现在被调换了,最后的19消失了。
哎呀! 1739 现在被选中,这似乎是合法的:用户已经选择了第三个项目,即使在更新后它仍然被选中。

我希望问题现在很明显:我需要选择来“跟踪”到底选择了什么项目。使用项目本身的一些内部 ID。因此,如果新列表包含一个与之前选择的项目具有相同 ID 的项目,它将被选中。

我可以在更新时自己更改选择,或者使用 insertRowremoveRow,但我不知 Prop 体是什么(173918 被交换了)在列表中发生了变化,我刚收到一个新的整数列表。

我查看了 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com