问题描述:

在提交表格数据之后,需要重新调用获取数据函数来刷新,但获取函数中包含有按钮信号的槽函数。然而,存在一个bug,重复调用获取数据函数会导致按钮信号重复发送的问题,每当用户执行xuanke函数并多次调用self.index3()时,每次调用都会导致按钮信号的槽函数重新连接一次。这意味着每次点击按钮,都会执行xuanke函数的逻辑多次,导致重复的执行和不符合预期的结果。

Bug 影响:

该bug会导致按钮的信号槽函数重复执行,从而导致不符合预期的结果出现。这可能引起程序逻辑错误、操作重复或数据异常等问题,影响用户体验和软件功能的正确性。

代码复现:

def index3(self):
    # 获取数据逻辑
    # 此处省略……
    # 按钮信号
    # 当用户点击确定按钮所发送的信号
    self.xs.pushButton.clicked.connect(self.xuanke)
    # 获取表中触发的信号
    self.xs.tableWidget_2.clicked.connect(self.on_clicked)

def xuanke(self):
    # 提交数据逻辑
    # 此处省略……
    # 清空全部行
    self.xs.tableWidget_2.setRowCount(0)
    self.xs.tableWidget.setRowCount(0)
    # 重新获取一遍选课数据
    self.index3()

解决方法:

在刷新数据之前,可以尝试断开按钮的信号连接,以防止在刷新数据时按钮信号的重复触发。这种方法适用于大多数的信号重叠问题。但是处于那种多种多重信号的情况下,有些会失灵,最终解决方法是将全部信号作为一个函数,这样子当执行获取数据函数的时候,就不会再携带信号重新发起信号。

def Signal(self):
    # 按钮信号
    # 当用户点击确定按钮所发送的信号
    self.xs.pushButton.clicked.connect(self.xuanke)
    # 获取表中触发的信号
    self.xs.tableWidget_2.clicked.connect(self.on_clicked)

def index3(self):
    # 获取数据逻辑
    # 此处省略......

def xuanke(self):
    # 提交数据逻辑
    # 此处省略......

    # 清空全部行
    self.xs.tableWidget_2.setRowCount(0)
    self.xs.tableWidget.setRowCount(0)
    # 重新获取一遍选课数据
    self.index3()