给定一个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++解决方案没有问题。我可以替换模型,但我也在考虑模型也与文件或数据库交互的情况,所以我想处理清理可能涉及额外步骤的场景。
这里有一个很好的例子。基于此,我能够覆盖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))