问题描述:

在教师界面的开发中,需要进行表格内容的查询,并在查询到内容后自动跳转到相应位置。第一次查询时,会获取到匹配的结果并为其添加背景颜色。然而,第二次查询时,第一次查询结果的背景颜色并没有被清除,导致背景颜色会一直累加。为了解决这个问题,最初的解决方案是在第二次查询之前将整个表格的背景颜色恢复为默认值。

Bug影响:

这种方法有一个缺点,即如果需要逐个恢复表格中的行和列的背景颜色,会占用大量内存并降低程序的运行效率。

解决方法:

为了优化这个问题,采用了另一种解决方案。该方案保存了上一次查询到的行和列的信息作为全局变量,并在第二次查询之前将上一次查询结果的坐标对应的单元格恢复为默认背景颜色。

代码演示:


def index2(self):
    # 此处省略逻辑代码……
    self.rows = []
    self.cols = []

def index2_cz(self):
    cz_nr = self.js.lineEdit.text()
    for row, col in zip(self.rows, self.cols):
        item = self.js.tableWidget_2.item(row, col)
        item.setBackground(QBrush())  # 设置为默认的透明背景颜色
    # 清空列表
    self.rows.clear()
    self.cols.clear()
    res = self.js.tableWidget_2.findItems(cz_nr, Qt.MatchFlag.MatchContains)
    for i in res:
        self.rows.append(i.row())  # 将当前行添加到列表中
        self.cols.append(i.column())  # 将当前列添加到列表中
        i.setBackground(QColor(255, 255, 0))
    # 跳转到查询的第一个内容的位置
    self.js.tableWidget_2.scrollToItem(res[0], QTableWidget.PositionAtTop)

代码讲解:

其中将查询到的内容坐标存放到self.rows和self.cols中,然后再二次查询之前,将上一次的坐标恢复默认背景颜色,然后二次查询之后,又将新的查询内容坐标存放于self.rows和self.cols中,以此反复。