PyQt5窗口搜索功能异常:搜索E结果不符,如何修复?
问题分析与修复方案
你的搜索功能出现错误,核心是两个Python代码逻辑bug,和SQL查询环节无关:
1. 表格未正确清空旧内容
当前代码仅在表格行数为0时尝试移除行,等于没有执行任何清空操作。之前的搜索内容会残留,导致新结果叠加或显示错误。
2. 行索引递增逻辑错误
插入匹配项时,不管当前产品是否符合搜索条件,row都会每次循环+1,导致匹配内容被放到错误的行位置,甚至残留的旧内容会被误当成新结果显示。
修复后的loaddata函数代码
def loaddata(self): # 彻底清空表格所有行 while self.tableWidget.rowCount() > 0: self.tableWidget.removeRow(0) sdb.c.execute("SELECT * FROM products") prod_li = sdb.c.fetchall() names = [x[0].lower() for x in prod_li] row_count = 0 value = self.lineEdit.text().lower() # 统计匹配项数量 for name in names: if value in name: row_count += 1 self.tableWidget.setRowCount(row_count) row = 0 for idx in range(len(names)): if value in names[idx]: col = 0 for y in prod_li[idx]: chkBoxItem = QTableWidgetItem(str(y)) if prod_li[idx].index(y) == 0: chkBoxItem.setFlags(QtCore.Qt.ItemFlag.ItemIsUserCheckable | QtCore.Qt.ItemFlag.ItemIsEnabled) chkBoxItem.setCheckState(QtCore.Qt.CheckState.Unchecked) self.tableWidget.setItem(row, col, chkBoxItem) else: self.tableWidget.setItem(row, col, chkBoxItem) col += 1 # 仅在插入匹配项后递增行索引 row += 1 self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
额外优化建议:直接用SQL过滤数据
当前先查所有数据再在内存过滤的做法效率低且易出错,可直接通过SQL完成过滤,代码更简洁高效:
def loaddata(self): # 清空表格 while self.tableWidget.rowCount() > 0: self.tableWidget.removeRow(0) value = self.lineEdit.text().lower() # 使用参数化查询避免SQL注入,直接过滤数据 # 假设产品名称是数据库表的第一列,列名为name,若不是请替换为实际列名 sdb.c.execute("SELECT * FROM products WHERE LOWER(name) LIKE ?", (f"%{value}%",)) prod_li = sdb.c.fetchall() self.tableWidget.setRowCount(len(prod_li)) row = 0 for prod in prod_li: col = 0 for y in prod: chkBoxItem = QTableWidgetItem(str(y)) if prod.index(y) == 0: chkBoxItem.setFlags(QtCore.Qt.ItemFlag.ItemIsUserCheckable | QtCore.Qt.ItemFlag.ItemIsEnabled) chkBoxItem.setCheckState(QtCore.Qt.CheckState.Unchecked) self.tableWidget.setItem(row, col, chkBoxItem) else: self.tableWidget.setItem(row, col, chkBoxItem) col += 1 row += 1 self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
内容的提问来源于stack exchange,提问作者Jethro Moses Sala
相关产品推荐
相关产品推荐

