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
相关产品推荐
相关产品推荐

