QAbstractTableModel 和 QSortFilterProxyModel - 如何清除数据和更新视图
Posted
技术标签:
【中文标题】QAbstractTableModel 和 QSortFilterProxyModel - 如何清除数据和更新视图【英文标题】:QAbstractTableModel and QSortFilterProxyModel - how to clear data and update view 【发布时间】:2021-12-03 16:13:30 【问题描述】:给定一个QSortFilterProxyModel
和一个QAbstractTableModel
,并将代理设置为表模型,并且该代理在QTableView
中使用,我将如何
伪代码:
class MyTableModel(QAbstractTabelModel):
def __init__(self, parent=None):
QAbstractTabelModel.__init__(self, parent)
self.entries = [ <data entries here> ]
@Slot()
def slot_clear_entries(self):
self.entries.clear()
# Trigger refresh of model and notify all connected views
pass
# data(), headerData() etc.
# ...
class MyProxyModel(QSortFilterProxyModel):
def __init__(self, parent=None):
QSortFilterProxyModel.__init__(self, parent)
class MyTableView(QTableView):
def __init__(self, parent=None)
QTableView.__init__(self, parent)
self.model = MyTableModel()
self.proxy = MyProxyModel()
self.proxy.setSourceModel(self.model)
self.setModel(self.proxy)
我在上面使用 PySide,但对 PyQt 或纯 Qt C++ 解决方案没有任何问题。我可以替换模型,但我也在考虑模型还与文件或数据库交互的情况,因此我想处理清理可能涉及额外步骤的情况。
【问题讨论】:
【参考方案1】:找到了一个很好的例子here。基于它,我能够覆盖 MyTableModel
内的以下内容并添加一个触发删除所有条目的插槽:
def removeRows(self, row, count, parent=QModelIndex(), *args, **kwargs):
self.beginRemoveRows(parent, row, row+count-1)
print(row, count)
del self.entries[row:row+count]
self.endRemoveRows()
return True
@Slot()
def slot_clear_entries(self):
self.removeRows(0, len(self.entries))
【讨论】:
请注意,如果要完全清除内容,则不应使用removeRows
,而应在清除条目之前使用beginResetModel()
,然后再使用endResetModel()
。以上是关于QAbstractTableModel 和 QSortFilterProxyModel - 如何清除数据和更新视图的主要内容,如果未能解决你的问题,请参考以下文章
QAbstractTableModel 和 QSortFilterProxyModel - 如何清除数据和更新视图
从 QAbstractTableModel 类中访问视图和代理模型?
如何使用 QAbstractTableModel 而不是 QSortFilterProxyModel 进行排序和过滤