我使用 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
)。
答案 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。