Qt 如何正确实现同一数据集的不同视图选项

Qt 如何正确实现同一数据集的不同视图选项,qt,mvvm,Qt,Mvvm,我目前正在构建模型视图体系结构,遇到了一个问题,我无法在internet上找到相关信息 我有一组复杂的数据,我想以两种(或更多)不同的方式向用户展示: 显示完整数据 仅显示中的选定(部分)信息 这些数据的打印方式对我来说无关紧要,但如果这有帮助的话,它要么在表视图(基本信息)中,要么在列视图(完整信息)中。这两个类别来自QT模型/视图框架 现在我考虑了两个实现这个的选项,并想知道我应该使用哪一个 选择1 我建立我的数据结构 将其包含在自定义模型中 专门化(子类)视图类,以便只打印我感兴趣的

我目前正在构建模型视图体系结构,遇到了一个问题,我无法在internet上找到相关信息

我有一组复杂的数据,我想以两种(或更多)不同的方式向用户展示:

  • 显示完整数据
  • 仅显示中的选定(部分)信息
这些数据的打印方式对我来说无关紧要,但如果这有帮助的话,它要么在表视图(基本信息)中,要么在列视图(完整信息)中。这两个类别来自QT模型/视图框架

现在我考虑了两个实现这个的选项,并想知道我应该使用哪一个

选择1

  • 我建立我的数据结构
  • 将其包含在自定义模型中
  • 专门化(子类)视图类,以便只打印我感兴趣的内容
选择2

  • 我建立我的数据结构
  • 专门化我的模型,只提供对相关数据的访问
  • 使用standart视图在屏幕上打印
老实说,我会选择选项2,但看到互联网上使用选项1的案例数量,我开始怀疑我是否做得对。(当一个模型的多个视图相当频繁时,我从未发现任何数据的双模型示例)

在视图类中放置与数据相关的处理对我来说似乎是错误的,但复制数据的模型会导致复制数据(这似乎也是错误的)或共享数据(然后模型不再“保存”数据)


我还查看了QT委托,但这些类主要用于更改数据的外观。我没有找到使用代理忽略与一个视图无关的数据的方法。

您完全正确地认为使用视图过滤数据是错误的。重新实现视图的唯一原因是对同一数据有不同的视图或对用户事件进行特殊处理

因此,有两种方法可以过滤数据:

1.创建两个共享数据的模型。这是一种标准方法——不在模型中保存数据

2.创建一个提供所有数据的模型,并创建一个继承自
QSortFilterProxyModel
的代理模型以过滤掉数据

您需要重新实现
filterAcceptsColumn
方法以筛选出列,并需要重新实现
filterAcceptsRow
以筛选出行


然后使用
查看模型
显示所有数据,或使用
查看代理模型
显示一些数据。

您所说的“选定数据”很重要。你的意思是从所有记录中漏掉一些列,漏掉一些行,还是两者都漏掉?从QT的角度来看,应该过滤掉的不是行或列,而是子元素。行的行(如果愿意),以及相关列数据。感谢您的回答。我非常喜欢QSortFilterProxyModel类,我将更深入地了解它。它看起来像是双模型方法的标准实现。我也很欣赏关于数据处理的链接,QT模型视图让我认为模型实际上应该“保存”数据。