Python 如何保持多个QabstracteModel类同步

Python 如何保持多个QabstracteModel类同步,python,qt,pyqt,pyside,Python,Qt,Pyqt,Pyside,在过去的几周里,我一直在努力寻找解决办法。我现在已经承诺了一个方向,但我仍然对自己的想法不完全满意。现在提出这个问题纯粹是出于好奇,希望下次能找到更合适的解决方案 我究竟如何保持多个引用相同源数据但在树状视图中以不同方式显示的QAbstractItemModel类同步 使用模型/视图的主要原因之一是保持多个视图彼此同步。但是,如果我的每个视图都要求在同一列中显示不同的数据,就我所知,我需要将我的模型子类化为两个不同的模型,并使用不同的实现,以满足相同项目的每个独特视图显示 基础源项相同,但显示的

在过去的几周里,我一直在努力寻找解决办法。我现在已经承诺了一个方向,但我仍然对自己的想法不完全满意。现在提出这个问题纯粹是出于好奇,希望下次能找到更合适的解决方案

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

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

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

我将尝试给出一个例子:

假设我的树元素有三个属性:a、b、c

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

TreeView W1按如下方式显示数据:列1->a,列2->b

TreeView 2按如下方式显示数据:列1->a,列2->c

然后我需要创建两个不同的模型,一个用于TreeView1,一个用于TreeView2,并相应地覆盖每个模型的数据和标志方法

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

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

我觉得在处理这个问题时,我遗漏了一些重要的设计模式或其他东西。有人能看到我哪里出了问题并纠正我吗?或者这是正确的解释


谢谢

一种方法是使用viewmodels。为基础数据模型提供一个
qabstractemmodel
适配器。所有交互都必须通过该模型。当需要进一步将数据适配到视图时,只需使用引用上述适配器的代理视图模型类,并为视图重新格式化/适配数据。所有视图模型将自动同步。它们可以从
QAbstractProxyModel
派生,尽管严格来说这不是必需的


如果底层数据源不同时为内容和结构提供更改通知,则没有其他方法可以做到这一点。如果底层数据源提供了相关通知,那么它也可以是一个
qabstractemmodel
开头:)

有趣的。我一直计划按照这些思路做一些事情(使用QSortFilterProxyModel),尽管只是根据视图过滤掉某些项目。不过,我仍然会复制底层模型。听起来我应该进一步研究代理模型以更好地理解它们。@Mathieson代理模型几乎是一个没有gui的视图,而是一个模型API来代替gui的视图。将代理视为一个机器可读的视图,在这个视图中,机器可读的API也是一个模型的API。在完成此任务或一些良好实现的示例时,您是否可以链接到任何良好的资源?这是迄今为止我在这个主题上发现的最好的一个问题,即使在我链接了这篇文章之后,仍然存在一个问题,那就是如何为TreeView正确配置。他的例子似乎适用于列表视图。我的模型层次结构有多个层次。在我的一些视图中,我需要显示主模型中的数据,例如,第三级子级。简单地根据类型筛选树项将隐藏父项,而父项又将隐藏子项。是否以某种方式重写mapFromSource方法,以便将第三级子级重新映射到顶层?刚刚发现这个页面有一个很好的示例(您实际提供了!)