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

PyQt5如何从二级窗口返回已被隐藏的主窗口

问题原因

你当前代码的核心问题是判断二级窗口是否点击返回的逻辑触发时机错误:

  • TestA_clickMethod 中的if self.TestingA.back == True判断是点击TestA按钮、隐藏主窗口时同步执行的,此时二级窗口刚打开,用户还没点击Back按钮,这段判断只会执行一次就结束,后续点击Back时不会重新触发
  • 所有窗口都处于隐藏状态后,Qt的事件循环会判定程序无活跃窗口,自动退出
  • 额外小问题:代码使用了sys.argv但未导入sys库,且用time.sleep阻塞了UI线程,会导致界面卡顿无响应

修改方案

我们通过监听二级窗口的关闭信号,在二级窗口关闭时再判断是否需要显示主窗口即可,修改后的完整可运行代码如下:

import sys
import os
import PyQt5
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QWidget, QLabel, QPushButton
from PyQt5.QtCore import QSize, QTimer

class GUI_Window():
    def __init__(self):
        self.main_window()
        return

    def main_window(self):
        app = PyQt5.QtWidgets.QApplication(sys.argv)
        self.MainWindow = MainWindow_()                                                  
        self.MainWindow.show()                                                                    
        app.exec_()                                                                      
        return
                  

class MainWindow_(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.resize(300,200)
        self.TestAButton = QPushButton("TestA", self)
        self.TestAButton.clicked.connect(self.TestA_clickMethod)
        self.TestAButton.move(20, 0)

        self.CloseButton = QPushButton("Close", self)
        self.CloseButton.clicked.connect(self.Close_clickMethod)
        self.CloseButton.move(20, 40)

        self.TestingA = TestA_MainWindow()
        # 绑定二级窗口关闭信号到处理函数
        self.TestingA.destroyed.connect(self.on_testA_closed)

    def TestA_clickMethod(self):
        self.TestAButton.setEnabled(False)
        # 用QTimer替代time.sleep避免阻塞UI
        QTimer.singleShot(200, lambda: self.TestingA.show())
        self.hide()

    # 新增二级窗口关闭处理函数
    def on_testA_closed(self):
        if hasattr(self.TestingA, 'back') and self.TestingA.back:
            self.show()
            self.TestAButton.setEnabled(True)
            # 重置back状态避免下次打开误判
            self.TestingA.back = False

    def Close_clickMethod(self):
        self.Test_Choice = 'Exit'
        self.close()


class TestA_MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setMinimumSize(QSize(980,700))
        self.setWindowTitle("TestA")
        # 初始化back属性避免未点击时属性不存在报错
        self.back = False
        self.Back_Button = False

        self.closeButton = QPushButton("Close", self)
        self.closeButton.clicked.connect(self.clickMethodClose)

        self.returnButton = QPushButton("Back", self)
        self.returnButton.clicked.connect(self.clickMethodBack)
        self.returnButton.move(0,30)

    def clickMethodClose(self):
        self.Back_Button = False
        self.back = False
        self.close()

    def clickMethodBack(self):
        self.returnButton.setEnabled(False)
        # 用QTimer替代time.sleep
        QTimer.singleShot(500, self._back_delay_finish)
    
    def _back_delay_finish(self):
        self.back = True
        self.close()

# Run if Script
if __name__ == "__main__":
    main = GUI_Window()                                                   # Initialize GUI

关键修改点

  • 新增了on_testA_closed槽函数,监听二级窗口的销毁信号,在二级窗口关闭时再判断是否需要显示主窗口
  • 用Qt自带的QTimer.singleShot替代阻塞UI的time.sleep,避免界面假死
  • 初始化了self.back属性,避免未点击Back按钮时属性不存在的异常
  • 每次返回主窗口后重置back状态,避免下次打开二级窗口时出现误判

内容的提问来源于stack exchange,提问作者wwj123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:15:03