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

标签 c++ qt model-view-controller qt4 selection

好的,所以我设置了一个 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/

相关文章:

java - Struts2 推送通知/WebSocket 交互最佳实践

c# - 如何将 C++ 对象传递给 C#

linux - 为什么 QProcess 不 kill,close,terminate 调用进程的析构函数?

c++ - 使用 toLatin1() 将 QString 转换为 QByteArray 会出现链接器错误

c++ - 如何在没有选择的情况下更改 QTextEdit 中的当前行格式?

javascript - 如何在 nodejs 的 views 文件夹中包含 View 相关的 javascript (*.js) 文件?

php - Symfony2 表单组件 - 违反 MVC 和 SRP?

c++ - 显式特化是使用部分特化语法

c++ - 阵列衰减和修改

c++ - 复制构造函数调用无限循环