假如有这样一个题目:用PyQt创建了两个窗口,第一个窗口用来登录,当登录成功后,自动关闭第一个窗口,弹出第二个窗口。
问题:如何通过程序关闭第一个窗口呢?
先看我顶层文件的代码:
if __name__ == "__main__":
app = QApplication(sys.argv)
w1 = MyWindow() # 第一个窗口
w1.ui.show()
app.exec()
# -----------------< 想在这里 关闭第一个窗口,打开第二个窗口
w2 = MyWindow2() # 第二个窗口
w2.ui.show()
app.exec()
从网上查了一圈,我整出了一个可用的方法:
首先,第一个窗口的class中,它在想关闭自己的时候,执行QCoreApplication.instance().quit()
# 需要引入的头文件
from PyQt5.QtCore import QCoreApplication
# 关闭窗口进程需要执行的代码
QCoreApplication.instance().quit()
上面第一句话是需要引入的头文件,第二句话就是在关闭该窗口执行的代码,执行该代码会强制QApplication的循环结束,如果程序中只有一个窗口的话,循环结束后,窗口就自动关闭了。
但是在咱们的题目中,第一个窗口结束后,总程序没有结束,所以这样子虽然会调用出第二个窗口,但是第一个窗口依然存活,依然可以点击(至于为什么,还得查看一下C++源码)。那么 在顶层文件中添加一句话就可: del w1
if __name__ == "__main__":
app = QApplication(sys.argv)
w1 = MyWindow()
w1.ui.show()
app.exec()
del w1 # 上一段进程QApplication循环结束后,执行del w1删除创建的窗口,将窗口关闭
w2 = MyWindow2()
w2.ui.show()
app.exec()
完美解决!大家可以试一试
那么 QCoreApplication.instance().quit() 这句话放在哪里呢,可以绑定一个按钮,放在按钮的槽函数(回调函数)中,或者放在任何一个槽函数中,只要满足一定的条件,就可以将其关闭,比如在该题目中,检测到输入用户名和密码正确时,就执行这句话,让Application的循环结束,顶层文件的程序就会执行del w1,关闭第一个窗口,打开第二个窗口。