You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:30:59