假设我有一个datalist存储10,000个字符串实体的列表变量.的QTableView需求,只显示一些实体.这就是QTableView分配QSortFilterProxyModel完成所有过滤的原因.完成所有代理工作后,QTableView"接收"25个实体进行显示(因此剩余的9,975个实体被"过滤掉".
现在,我创建一个QLineEdit用作搜索字段的用户可以键入关键字以进一步缩小显示的25个实体(项目)的列表.为此我链接QLineEdit的textChanged信号分配给QTableView中代理的filterAcceptsRow()方法.
我在这里看到的问题是代理模型需要回到原来的10,000个实体长列表再次重新过滤.然后再次.然后再次.
我想知道是否有可能创建第二个代理,它将拾取第一个代理已经过滤掉的内容:25个实体而不是10,000个实体.
所以生成的模式如下所示:
datalist> QAbstractTableModel> QSortFilterProxyModel> QSortFilterProxyModel>QTableView
哪里:
datalist 是10,000个实体长列表变量.
QAbstractTableModel 是一个基础数据模型
QSortFilterProxyModel 是第一个执行最脏和最慢过滤作业的代理模型
QSortFilterProxyModel 是第二个代理模型,用于对第一个代理数据进行预过滤(用于按用户的关键字进行过滤).
QTableView 是一个QTableView本身用于显示实体项目.
所以,问题是:这是一个有效的想法吗?
之前,我询问a question过多列过滤,我们需要表示适合多个过滤模式的行。
现在,在处理大表(big我的意思是大约 200,000 行和 4 列)时,如果我们有一个那么大的表,过滤就会变慢(通常这对于过滤模式的前 2 个字符来说是最糟糕的)。
那么您对此有何建议?
注意:我有自己的高性能源数据模型(而不是QStandardItemModel),基于this示例,该模型在大约 1 秒内提供我对该行数的视图
改变我的方法:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
if (/* filtering is enable*/) {
bool _res = sourceModel()->data(sourceModel()->index(source_row, 0, source_parent)).toString().contains( /*RegExp for column 0*/);
for (int col = 0; col < columnCount(); col++) {
_res &= sourceModel()->data(sourceModel()->index(source_row, col + 1, source_parent)).toString().contains(/*RegExp for column col + 1*/);
}
return _res;
}
return true;
Run Code Online (Sandbox Code Playgroud)
}
对此:
bool DataFilter::filterAcceptsRow(int source_row, …Run Code Online (Sandbox Code Playgroud)