如何检测Qt子窗口关闭并更新主窗口ComboBox?
解决关闭子窗口后更新主窗口ComboBox的问题
你现在的问题是调用self.InputClass.show()后立刻执行了self.boxclass(),但show()是非阻塞的——也就是说子窗口刚打开,还没等用户操作关闭,更新ComboBox的代码就已经跑完了,而且子窗口关闭时也没有触发更新的逻辑。咱们可以用PyQt的信号与槽机制来解决这个问题,让子窗口关闭时主动通知主窗口去更新ComboBox。
步骤1:给子窗口添加关闭信号
修改你的InputWindow类,添加一个自定义信号,并重写窗口的关闭事件,在窗口关闭时发射这个信号:
from PyQt4.QtCore import pyqtSignal # 记得导入pyqtSignal class InputWindow(QtGui.QMainWindow, gui.Ui_KelasSuara): # 定义一个自定义信号,用于通知主窗口我关闭了 window_closed = pyqtSignal() def __init__(self): QtGui.QMainWindow.__init__(self) gui.Ui_KelasSuara.__init__(self) self.setupUi(self) self.BtnTambah.clicked.connect(self.Tambahkan) def Tambahkan(self): self.listClass.clear() # 用with语句管理文件,更安全,不用手动close with open('data/ClassSuara.csv','a') as ClassSuara: ClassSuara.write(self.lineClass.text()+'\n') # 清空输入框,提升用户体验 self.lineClass.clear() def closeEvent(self, event): # 窗口关闭时发射信号 self.window_closed.emit() # 必须调用父类的closeEvent,否则窗口无法正常关闭 super(InputWindow, self).closeEvent(event)
步骤2:主窗口连接信号与更新方法
修改主窗口的inputclass方法,把原来提前调用的self.boxclass()删掉,转而连接子窗口的window_closed信号到更新方法:
import AnotherWindow as cl def inputclass(self): self.InputClass = cl.InputWindow() # 关键:把子窗口的关闭信号和更新ComboBox的方法绑定 self.InputClass.window_closed.connect(self.boxclass) self.InputClass.show() def boxclass(self): self.BoxClass.clear() # 优化文件读取逻辑,避免字符串切片的坑 with open('data/ClassSuara.csv','r') as f : reader = csv.reader(f) for row in reader: # 跳过空行,避免添加空内容到ComboBox if row: self.BoxClass.addItem(row[0])
为什么这样能行?
- 当用户关闭子窗口时,
closeEvent会被触发,发射window_closed信号; - 主窗口通过
connect把这个信号和boxclass方法绑定,信号触发时就会自动调用更新方法; - 优化后的
boxclass用row[0]直接获取每行的内容,比字符串切片更可靠,还能跳过空行。
内容的提问来源于stack exchange,提问作者Danny Bastian
相关产品推荐
相关产品推荐

