【发布时间】:2014-06-26 20:32:16
【问题描述】:
好的,所以我设置了一个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,但我不知道列表中究竟发生了什么变化(1739 和18 已交换),我刚刚收到一个新的整数列表。
我看过 QItemSelectionModel,虽然 Qt 文档说
QItemSelectionModel 类跟踪视图的选定项。
,它看起来不像我需要的。我认为这是我需要子类化的另一个代理模型,但事实并非如此。
接下来我认为我的模型是编写跟踪选择的代码的正确位置,但我又失败了:模型无法检索视图的选择模型 (view->selectionModel()),因为它无法访问视图。
我最终可能会在我的模型中编写一些信号和槽,以便模型外部的代码可以更新选择,加上模型外部连接到视图的 selectionModel 的槽来更新存储在模型中的当前选定项目的 id等,但在写这些东西之前,我想问问是否已经有一些我不知道的练习。
解释所有这些东西的文档和文章太少了,我自己也找不到上述问题的答案。
谢谢!
【问题讨论】:
标签: c++ qt model-view-controller qt4 selection