PyQt5中QTableWidget指定列过滤行时出现逻辑异常的问题求助
PyQt5中QTableWidget指定列过滤行时出现逻辑异常的问题求助
你遇到的问题根源在于那行多余的break语句,咱们拆解下问题:
在最初的多列过滤代码里,break是用来跳出「当前行的列循环」——只要一行里有任意一列匹配过滤文本,就不用再检查这行的其他列,直接处理下一行,这个逻辑是完全合理的。
但修改为单列过滤后,你已经删掉了列循环,可保留的break却变成了跳出整个行循环!这就导致:只要找到第一个匹配过滤文本的行,后面所有行的隐藏状态都不会被更新,停留在上一次过滤的结果,这就是你看到奇怪显示问题的原因:
- 搜索"John Smith"时,找到第12行匹配后就停止循环,第13-100行没被处理,保持之前的显示状态;
- 清空输入框时,处理完第一行后触发
break,后续行没被设置为显示,所以还是保持之前的隐藏状态。
修复方案
直接删掉那行多余的break即可,修复后的filterer函数如下:
def filterer(self, filtertext): icol = self.fltrcb.currentIndex() for irow in range(self.table.rowCount()): item = self.table.item(irow, icol).text() match = filtertext.lower() not in item.lower() self.table.setRowHidden(irow, match)
额外优化建议
如果想让逻辑更清晰、效率更高,可以加上空文本判断,直接显示所有行:
def filterer(self, filtertext): filter_text_lower = filtertext.lower() target_col = self.fltrcb.currentIndex() # 过滤文本为空时,直接显示所有行 if not filter_text_lower: for row_idx in range(self.table.rowCount()): self.table.setRowHidden(row_idx, False) return # 逐行检查指定列 for row_idx in range(self.table.rowCount()): cell_text = self.table.item(row_idx, target_col).text().lower() # 标记是否需要隐藏该行:过滤文本不在单元格文本中则隐藏 need_hide = filter_text_lower not in cell_text self.table.setRowHidden(row_idx, need_hide)
这样处理不仅避免了空文本时的无效遍历,变量命名也更易读,后续维护起来更方便~
备注:内容来源于stack exchange,提问作者Kes Perron
相关产品推荐
相关产品推荐

