两个不同的 QTreeView 和一个共享的 QStandardItemModel

Posted

技术标签:

【中文标题】两个不同的 QTreeView 和一个共享的 QStandardItemModel【英文标题】:Two different QTreeViews with one shared QStandardItemModel 【发布时间】:2020-10-16 00:18:15 【问题描述】:

我有一个简单的任务,但正在努力寻找正确的实施方式:

我希望一个共享的 QStandardItemModel 包含一个树结构,以显示在两个不同的 QTreeView 中。 第一个 QTreeView 按原样显示模型,并允许用户添加、删除和重新排列项目。单击一个项目会在 QTreeView 下方的 QStackedWidget 中显示一个与项目相关的 QWidget。某些项目类型也可以重命名。 第二个 QTreeView 显示相同的树模型,但默认情况下所有项目都显示为灰色。然后处理器将沿着树结构移动并处理每个项目。每当处理一个项目时,它不应再显示为灰色。那些没有变灰的项目应该是可点击的,以在查看器中显示项目对应的处理图像。每当在第一个 QTreeView 中进行更改时,处理器就会再次从更改的位置开始处理。

如何实现两个 QTreeView 的不同外观和功能?我是否将自定义 QItemDelegates 分配给每个 QTreeView?我应该为第二个 QTreeView 使用 QIdentityProxyModel 吗?

【问题讨论】:

【参考方案1】:

只需对两个模型使用 QStandardItemModel,因为它们存储相同的信息,因此如果您希望它们看起来不同,则必须使用委托。

如果您想要在单击视图时执行一些操作,那么这不依赖于模型,但您必须使用独立于其他视图的视图单击信号。

对于第二个视图,如果需要委托更改颜色,逻辑是使用角色来指示该项目是否已被处理,然后根据该角色更改颜色。当您说“第一个 QTreeView 发生变化”时,实际上应该说“模型发生变化”,因此只需使用 dataChanged 信号,通过在处理前后更改角色状态来处理项目。

【讨论】:

以上是关于两个不同的 QTreeView 和一个共享的 QStandardItemModel的主要内容,如果未能解决你的问题,请参考以下文章

QTreeView 的两个嵌套代理模型和段错误

QTreeView,每个级别的样式不同

带有自定义项的 QTreeView

QTreeView - 排序和过滤模型

自定义 QTreeView 项目

QTreeView 切换标签位置