【问题标题】:Multiple QSortFilterProxyModel performance optimization多个 QSortFilterProxyModel 性能优化
【发布时间】:2018-06-13 09:20:51
【问题描述】:

TL;DR

我想在不提高性能的情况下对单个表中的多个数据集进行分组 通过优化QSortFilterProxyModel 或迭代表数据模型。 (性能更好)


例如下面的主表:

+------+------+---------+
| Col1 | Col2 | Results |
+------+------+---------+
| a    | b    |       2 |
| a    | c    |       4 |
| v    | b    |       5 |
+------+------+---------+

可以通过指定一些分组条件输出多个聚合数据集 例如:

  • 组和总和“a”条目的条件

    Dataset results => a = 6
    
  • 组和总和“ab”条目的条件

    Dataset results => a = 2
    
  • 组和总的条件Col1

    Dataset results => a = 2
                       V = 1
    

每个结果数据集都将显示在适当的表格视图中。

我通过为每个组条件实现多个QSortFilerProxyModel 成功实现了这一点。 (我不得不继承QSortFilerProxyModel设置组条件并覆盖filterAcceptsRow函数。)

但是,问题在于性能、大型数据集和多个代理 Qt 代理模型将迭代 (filterAcceptsRow) 所有表模型 X 次,这会降低性能。

我想通过只迭代一次模型来创建多个数据集。

是否可以使用代理模型来实现?

或者也许我需要自己迭代主表模型并生成这些自定义模型?

注意在我看来,使用QSortFilerProxyModel 来实现它似乎是不可能的,因为模型索引, 如果我处理多个数据集,每个数据集都可以有不同的rowCount(),并且模型索引将被破坏

【问题讨论】:

  • 您实际上是对数据进行排序和过滤,即只显示满足您条件的行和列,还是显示您的条件结果?如果是第二个,我认为 QSortfilterProxyModel 不适合使用。
  • @plover,我想显示条件的结果,如果主表被过滤我想过滤条件结果。对于此任务,QSortfilterProxyModel 的替代方法是什么?
  • 所以条件的结果是静态的,除非数据发生变化或数据被过滤掉?对于仅在模型的“dataChanged”信号或应用新过滤器时重新计算的结果,我只会有一个不同的视图/小部件。

标签: qt qsortfilterproxymodel


【解决方案1】:

首先,创建自定义代理所需的一切都是QAbstractItemModel。您根本不需要从过滤代理类派生。如何实现这样的模型取决于您,但不要局限于认为代理实际上需要是抽象模型的实现以外的任何东西。代理类是为了您的方便:当不方便使用它们时 - 不要!

此外,可行的方法会有所不同,具体取决于您拥有的输出类型。如果每个过滤器只产生一行结果,那么只有一个代理生成所有这些结果就可以了——但是您在自己的表格视图中查看每个单行结果?也许您的 UI 要求这样做。如果分组可以产生多行数据(例如group on Col1output sum(Results)),那么您需要单独查看每个结果集。

然后我会创建一个与数据源接口的通用代理,但该代理不直接使用。事实上,这个代理只是一个QObject,根本不是从QAbstractItemModel 派生的。相反,它将创建QAbstractItemModel 实例,作为数据视图。他们会将请求转发到具有在任何条件下满足请求所需的所有数据的通用代理。

【讨论】:

  • 感谢您的回答,我会尝试实现通用代理的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 2016-05-14
相关资源
最近更新 更多