如何保持多个QAbstractItemModel类同步

时间:2015-03-18 21:10:50

标签: python qt pyqt pyside

在过去的几周里,我一直在努力寻找解决方案。我现在已经致力于一个方向,但我仍然不完全满意我的想法。现在问这个问题纯粹出于好奇,并希望下次有更合适的解决方案。

我如何保持多个QAbstractItemModel类同步,这些类引用相同的源数据,但在树视图中以不同的方式显示?

使用模型/视图的主要原因之一是使多个视图保持彼此同步。但是,如果我的每个视图都需要在同一列显示不同的数据,那么据我所知,我需要将我的模型子类化为两个不同的模型,这些模型具有不同的实现,然后将满足每个独特的视图显示。相同的项目。

基础源项目相同,但显示的数据不同。也许标志也是不同的,因此用户只能在一个视图中选择顶级项目,然后只能在另一个视图中选择子项目。

我试着举个例子:

假设我的TreeItem有三个属性:a,b,c。

我有两个树视图:TreeView1,TreeView2。每个都有两列。

TreeView1显示如下数据:column1 - > a,column2 - > B'/ P>

TreeView2显示如下数据:column1 - > a,column2 - > ç

然后我需要创建两个不同的模型,一个用于TreeView1,另一个用于TreeView2,并为每个模型适当地覆盖数据和标记方法。

由于它们现在是不同的模型,即使它们都在后台引用相同的TreeItem,它们也不再保持同步。每当我在TreeView1上更改数据时,我必须手动调用TreeView2上的刷新,反之亦然。

考虑column1或属性a是可编辑的,并允许用户设置TreeItem的名称。期望的行为将是在TreeView1中完成的编辑,以立即反映在TreeView2中。

当我接近这个时,我觉得我错过了一些重要的设计模式。任何人都可以看到我出错的地方并纠正我吗?或者这是正确的解释吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

一种方法是使用viewmodels。将一个 QAbstractItemModel适配器添加到基础数据模型中。所有交互都必须通过该模型。当您需要进一步调整数据到视图时,只需使用引用上述适配器的代理视图模型类,然后重新格式化/调整视图的数据。然后,所有视图模型将自动同步。它们可以来自QAbstractProxyModel,尽管这不是绝对必要的。

如果基础数据源不为内容结构提供更改通知

没有其他方式这样做
EM>。如果基础数据源提供相关通知,则可能以QAbstractItemModel开头:)