如何基于item.data()过滤QStandardItemModel,完全移除视图指定项?
问题分析与解决方案
你的当前实现方式不正确:重写data()方法只是隐藏了不符合条件项的显示文本,但并没有真正从代理模型中排除这些行,所以它们仍然会出现在视图里(只是显示为空)。要完全排除不符合条件的项,你需要重写QSortFilterProxyModel的filterAcceptsRow()方法——这才是代理模型用来决定是否保留某一行的核心逻辑。
正确实现代码
from PyQt5.QtCore import QSortFilterProxyModel, Qt from PyQt5.QtGui import QStandardItemModel class WatchlistProxyModel(QSortFilterProxyModel): def __init__(self, parent=None): super().__init__(parent) def filterAcceptsRow(self, source_row, source_parent): # 获取源模型中对应行的index source_index = self.sourceModel().index(source_row, 0, source_parent) # 通过index获取对应的QStandardItem item = self.sourceModel().itemFromIndex(source_index) # 获取item的自定义数据 item_data = item.data() # 处理数据为空或非字典的情况,避免异常 if not isinstance(item_data, dict): return False # 只保留source字段为'$WATCHLIST$'的项 return item_data.get('source') == '$WATCHLIST$'
代码说明
filterAcceptsRow()方法会针对源模型的每一行进行判断,返回True则保留该行,返回False则完全排除该行,视图中不会再显示这些被排除的项。- 增加了对
item_data类型的判断,避免当数据不是字典时出现异常。 - 使用
dict.get()方法替代直接索引,即使source字段不存在也不会抛出KeyError,确保逻辑健壮性。
内容的提问来源于stack exchange,提问作者misantroop
相关产品推荐
相关产品推荐

