在Qt中清除自定义过滤器代理模型中的数据时,它也将从其源模型中删除

时间:2016-08-31 06:55:52

标签: qt

我使用 QStandardItemModel 作为源模型在一个表视图中显示数据。 使用自定义过滤器代理模型( QSortFilterProxy模型的子类)对QStandardItemmodel应用过滤器操作后,再显示一个用于显示过滤器数据的表视图。

当我尝试从该自定义过滤器代理模型(QSortFilterProxy模型的子类)中删除数据时,它也将从中删除该数据 它的源模型(QStandardItemModel)。如何避免?

示例代码:

MySortFilterProxyModel *proxyModel;
QStandardItemModel *model
QTreeView *sourceView;
QTreeView *proxyView;

proxyModel->setSourceModel(model);
sourceView->setModel(model);
proxyView->setModel(proxyModel);

当我这样做时

proxyModel->removeRows(0,proxyModel->rowCount());

它也将从其源模型中删除数据(QStandardItemModel *model)。

1 个答案:

答案 0 :(得分:1)

您必须重新实现自己的virtual bool removeRows(...)。检查Qt doc:

  

如果您实现自己的模型,如果要支持删除,可以重新实现此功能。或者,您可以提供自己的API来更改数据。

QSortFilterProxyModel应该用于排序或过滤数据。

  

QSortFilterProxyModel类支持对另一个模型和视图之间传递的数据进行排序和过滤。

我建议使用标志来检查元素的状态并对其进行过滤,例如:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
<form id="form">
  <input type="submit" disabled/>
</form>
<div id="b64text" style="  word-wrap: break-word;">

</div>

现在在QSortFilterProxyModel::filterAcceptsRow(..)中添加一个新条件来检查元素的状态:

enum State {Valid, Invalid}

在你的sourceModel中,你应该为Qt :: UserRole或你想要的任何角色返回虚函数data()中元素的状态。

如果要从QSortFilterProxyModel中删除行,只需更改元素的状态并调用invalidate()以更新过滤器。

如果要从源模型中全局删除它,请使用removeRows。