如何延迟QTableWidget的item changed信号直到MySQL数据库加载完成
解决方案
你遇到的问题是批量往QTableWidget写入数据时,每次单元格内容变更都会触发itemChanged信号,导致绑定的两个槽函数误执行,可以通过以下两种方案解决:
方案1:临时阻塞表格信号(最简单)
在加载数据库数据的逻辑前后,通过blockSignals()方法临时禁用QTableWidget的所有信号,加载完成后再恢复。
示例代码如下:
def load_data_from_mysql(self): # 加载前先阻塞表格信号 self.tableWidget.blockSignals(True) try: # 这里是你原来从MySQL读取数据、往QTableWidget填数据的逻辑 # ...... finally: # 无论加载是否成功,最终都要恢复信号,避免后续操作无响应 self.tableWidget.blockSignals(False)
该方案改造成本极低,不需要修改原有槽函数的逻辑。
方案2:新增加载状态标志位(更灵活)
如果你在加载数据过程中还需要响应表格的其他信号,可以新增一个类属性标记加载状态,在槽函数中判断状态后决定是否执行逻辑。
步骤1:新增类属性
在类的__init__方法中新增加载状态标记:
def __init__(self): super().__init__() self.is_loading = False # 新增加载状态标记 self.changed_items = [] # 其他原有初始化逻辑......
步骤2:修改数据加载逻辑
加载数据前后修改状态标记:
def load_data_from_mysql(self): self.is_loading = True try: # 这里是你原来从MySQL读取数据、往QTableWidget填数据的逻辑 # ...... finally: self.is_loading = False
步骤3:修改原有槽函数,开头加状态判断
def log_change(self, item): # 加载中直接返回,不记录变更 if self.is_loading: return self.changed_items.append([item.row(),item.column()]) def item_changed(self, Qitem,item): # 加载中直接返回,不做校验 if self.is_loading: return if (item.column())%2 == 0: try: test = float(Qitem.text()) except ValueError: Msgbox = QMessageBox() Msgbox.setText("Error, value must be number!") Msgbox.exec() Qitem.setText(str(''))
该方案灵活性高,只屏蔽你不需要执行的槽函数,不会影响表格的其他信号响应。
内容的提问来源于stack exchange,提问作者daniel ajj
相关产品推荐
相关产品推荐

