You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在关闭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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:36:04