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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:20:43