多个QSortFilterProxyModel性能优化

时间:2018-06-13 09:20:52

标签: qt qsortfilterproxymodel

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(),模型索引将被打破

1 个答案:

答案 0 :(得分:1)

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

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

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