qt - 多个 QSortFilterProxyModel 性能优化
问题描述
TL;博士
我想通过优化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()
的,模型索引会被破坏。
解决方案
首先,创建自定义代理所需的一切都是QAbstractItemModel
. 您根本不需要从过滤代理类派生。如何实现这样的模型取决于您,但不要局限于认为代理实际上需要是抽象模型的实现以外的任何东西。代理类是为了您的方便:当使用它们不方便时 - 不要!
此外,可行的方法会有所不同,具体取决于您拥有的输出类型。如果每个过滤器只产生一行结果,那么只有一个代理生成所有这些结果就可以了——但是您在自己的表格视图中查看每个单行结果?也许您的 UI 要求这样做。如果分组可以产生多行数据(例如group on Col1
, output sum(Results)
),那么您需要单独查看每个结果集。
然后,我将创建一个与数据源接口的通用代理,但不直接使用该代理。事实上,这个代理只是一个QObject
并且根本不派生自QAbstractItemModel
。相反,它会创建QAbstractItemModel
实例,作为数据视图。他们会将请求转发到具有在任何条件下满足请求所需的所有数据的通用代理。
推荐阅读
- sql-server - SQL/C# 查找相同的 NVarchar 值,但最后的整数除外
- javascript - 如何使底部框阴影延伸到整个标题
- c++ - 将文件夹移动到 USB 驱动器时访问被拒绝
- json - Swift Codable 重用跨不同模型结构/类共享的键子集
- excel - 通过 VBA 保存具有不同结果的 TXT 文件(制表符分隔)
- node.js - 尝试在 node.js 中安装 node-sass 的奇怪问题
- reactjs - 如何在 Atlaskit 中指定自定义媒体客户端,尤其是 @atlaskit/editor-core
- angular - 角路由器插座破坏垫网格列表
- django - 在 django 中创建注册视图,总是出现完整性错误
- jenkins - 自动部署检查 Jenkins