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 类中访问视图和代理模型?

如何使用 QAbstractTableModel 而不是 QSortFilterProxyModel 进行排序和过滤

QAbstractTableModel:index() 与 createIndex()

如何在 QTableView/QAbstractTableModel 中使用多行文本/换行符?