首页 > 解决方案 > 多个 QSortFilterProxyModel 性能优化

问题描述

TL;博士

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


例如下面的主表:

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

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

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

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

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

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

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

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

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

标签: qtqsortfilterproxymodel

解决方案


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

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

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


推荐阅读