PyQt关闭第二个QDialog时重开第一个QDialog的代码失效问题
代码存在的核心问题
accept()是QDialog的实例方法,你直接写firstDialog.accept()是对类本身调用方法,没有作用在实际打开的那个弹窗实例上,不仅关不掉已打开的第一个窗口,还会触发参数错误。- 你在
secondDialog中没有持有已打开的第一个弹窗的引用,firstdial方法里是新建了一个全新的firstDialog对象,和之前展示旧数据的弹窗完全独立,根本无法操作旧窗口。 def closeandopen(self)行尾缺少冒号,存在基础语法错误,代码无法正常运行。
实现方案
优先推荐不用销毁重建窗口的方案:给firstDialog单独写数据刷新方法,重新拉取MySQL数据更新QTableWidget即可,比反复关窗开窗的体验更流畅、性能更好。如果确实需要关了重开,也可以在拿到第一个弹窗实例的前提下实现。
修正后的可运行代码如下:
class firstDialog(QtWidgets.QDialog): def __init__(self): super().__init__() # 这里放你原本的初始化逻辑:QTableWidget创建、布局设置等 self.table = QtWidgets.QTableWidget(self) # 初始化时先加载一次数据 self.refresh_data() def refresh_data(self): # 在这里写MySQL查询逻辑,拿到最新数据 # 清空表格旧内容后插入新数据即可,示例逻辑: # self.table.clearContents() # 遍历查询到的数据集,逐行插入表格 pass class secondDialog(QtWidgets.QDialog): # 初始化时传入已经打开的firstDialog实例,存为类属性 def __init__(self, first_dlg): super().__init__() self.linked_first_dlg = first_dlg def closeandopen(self): # 关闭当前第二个弹窗 self.accept() # 推荐方案:直接刷新第一个弹窗的数据,无需重建窗口 self.linked_first_dlg.refresh_data() self.linked_first_dlg.activateWindow() # 把第一个弹窗拉到前台 # 若必须关闭重开第一个弹窗,注释掉上面两行,用下面这段逻辑 # self.linked_first_dlg.close() # new_first_dlg = firstDialog() # new_first_dlg.show()
调用注意
从第一个弹窗唤起第二个弹窗时,必须把当前第一个弹窗的实例作为参数传入,示例写法:
# 写在firstDialog类里打开第二个弹窗的槽函数中 second_dlg = secondDialog(self) second_dlg.exec_()
内容的提问来源于stack exchange,提问作者IT-SRL
相关产品推荐
相关产品推荐

