如何在关闭PyQt5窗口时触发信号,实现子窗口关闭后重新显示菜单
PyQt QMainWindow自定义关闭信号实现方案
QMainWindow本身没有内置closed信号,我们可以通过重写关闭事件、添加自定义信号的方式实现需求,具体操作如下:
步骤1:修改子窗口类,添加自定义关闭信号
你导入的Caixa、Estoque、Relatorio三个模块中的Window类均继承自QMainWindow,给每个类添加自定义信号和closeEvent重写逻辑:
# 每个子窗口的定义文件中添加以下逻辑 from PyQt5.QtCore import pyqtSignal from PyQt5.QtWidgets import QMainWindow class Window(QMainWindow): # 定义自定义关闭信号 closed = pyqtSignal() def __init__(self, parent=None): super().__init__(parent) # 这里保留你原来的初始化逻辑,比如加载UI、绑定控件信号等 def closeEvent(self, event): # 先执行父类默认的关闭逻辑 super().closeEvent(event) # 确认关闭动作被接受后,触发自定义关闭信号 if event.isAccepted(): self.closed.emit()
步骤2:修改主逻辑代码,绑定信号
修改你贴出的主代码,新增子窗口关闭信号和菜单显示的绑定关系,你也可以把原来的退出菜单逻辑简化,统一走关闭信号的流程:
import sys from PyQt5 import uic from PyQt5.QtWidgets import QApplication import Caixa import Estoque import Relatorio app = QApplication(sys.argv) menu = uic.loadUi(r'window/menu.ui') caixa = Caixa.Window() estoque = Estoque.Window() relatorio = Relatorio.Window() # 菜单按钮触发逻辑 menu.caixa.clicked.connect(lambda: caixa.open()) menu.caixa.clicked.connect(lambda: menu.close()) menu.produtos.clicked.connect(lambda: estoque.open()) menu.produtos.clicked.connect(lambda: menu.hide()) menu.relatorio.clicked.connect(lambda: relatorio.open()) menu.relatorio.clicked.connect(lambda: menu.hide()) # 新增:绑定所有子窗口的关闭信号到菜单显示 caixa.closed.connect(menu.show) estoque.closed.connect(menu.show) relatorio.closed.connect(menu.show) # 退出菜单逻辑可以直接绑定关闭窗口,自动触发上述信号 estoque.window.exit.triggered.connect(estoque.close) caixa.window.exit.triggered.connect(caixa.close) relatorio.window.exit.triggered.connect(relatorio.close) menu.show() sys.exit(app.exec_())
效果说明
不管是点击子窗口右上角的关闭按钮,还是点击子窗口内的退出菜单,都会触发closeEvent发送closed信号,自动唤起菜单界面,覆盖所有关闭场景。
内容的提问来源于stack exchange,提问作者igor
相关产品推荐
相关产品推荐

