Qt 多重QSortFilterProxy模型性能优化

Qt 多重QSortFilterProxy模型性能优化,qt,qsortfilterproxymodel,Qt,Qsortfilterproxymodel,TL;DR 我希望在不提高性能的情况下,将单个表中的多个数据集分组 通过优化或迭代表数据模型。(哪个性能更好) 例如,以下主表: +------+------+---------+ | Col1 | Col2 | Results | +------+------+---------+ | a | b | 2 | | a | c | 4 | | v | b | 5 | +------+------+---------+ 通

TL;DR

我希望在不提高性能的情况下,将单个表中的多个数据集分组 通过优化或迭代表数据模型。(哪个性能更好)


例如,以下主表:

+------+------+---------+
| Col1 | Col2 | Results |
+------+------+---------+
| a    | b    |       2 |
| a    | c    |       4 |
| v    | b    |       5 |
+------+------+---------+
通过指定一些分组条件,可以输出多个聚合数据集 例如:

  • 组和总和“a”分录的条件

  • 组和总和“ab”项的条件

  • 组和和和的条件
    Col1

    Dataset results => a = 2
                       V = 1
    
每个结果数据集将显示在适当的表视图中

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

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

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

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

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

注意: 在我看来,似乎不可能通过使用
QSortFilerProxyModel
实现它,因为模型索引,
如果我创建了多个数据集,每个数据集可以有不同的
rowCount()
,模型索引将被破坏。

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

此外,可行的方法有点不同,这取决于您的输出算术类型。如果每个过滤器只生成一行结果,那么让一个代理生成所有结果就可以了——但您是在自己的表视图中查看每一行结果吗?也许您的UI需要这样做。如果分组可以生成多行数据(例如,
Col1上的group
输出总和(结果)
),则需要对每个结果集进行单独查看


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

您是在对数据进行排序和筛选,即仅显示满足条件的行和列,还是在显示条件的结果?如果是第二个,我认为QSortfilterProxyModel不适合使用。@plover,我想显示条件的结果,如果主表已筛选,我想筛选条件结果。对于此任务,
QSortfilterProxyModel
的替代方案是什么?因此,条件的结果是静态的,除非数据更改或数据被过滤掉?对于结果,我只会有一个不同的视图/小部件,它只会在模型的“dataChanged”信号或应用新过滤器时重新计算。感谢您的回答,我将尝试实现通用代理方法。
Dataset results => a = 2
Dataset results => a = 2
                   V = 1