【问题标题】:Close method does not close window pyqt5关闭方法不关闭窗口pyqt5
【发布时间】:2021-02-23 22:49:48
【问题描述】:

一个基本的例子,我试图调用 close() 方法来关闭主窗口,并没有关闭窗口,我必须手动关闭它。

from PyQt5 import QtWidgets
import sys
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Should close")
        self.close()  
        
app=QtWidgets.QApplication(sys.argv)
w=MainWindow()
w.show()
app.exec_()

如果我将self.show() 放在init 方法中,而不是使用w.show(),窗口将打开和关闭,但程序不会停止运行。如何自动关闭窗口和应用程序?

【问题讨论】:

    标签: python pyqt pyqt5 qmainwindow qtwidgets


    【解决方案1】:

    如果您分析您的逻辑,您将看到您所指示的内容是预期的,当您创建小部件时,它正在关闭它,因为您调用了 close() 方法,但在下一行中,您调用了 show() 方法,这将使窗口可见。

    为了更好地理解它,我可以告诉你,你的代码相当于:

    from PyQt5 import QtWidgets
    import sys
    
    app = QtWidgets.QApplication (sys.argv)
    w = QtWidgets.QMainWindow ()
    w.setWindowTitle ("Should close")
    w.close ()
    w.show ()
    app.exec_ ()
    

    正如您所注意到的,窗口关闭并不意味着应用程序结束,因为它们是两个正交的概念。如果您希望 close() 方法也终止程序,那么您必须在 eventloop 启动时调用 close() 方法:

    from PyQt5 import QtCore, QtWidgets
    import sys
    
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self):
            super().__init__()
            self.setWindowTitle("Should close")
            QtCore.QTimer.singleShot(0, self.close)
    
    
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exec_()
    

    为什么事件循环必须在关闭唯一打开的窗口时终止应用程序?好吧,因为 evenloop(本例中为 QApplication)使用了标志 quitOnLastWindowClosed,默认为 true,这使得应用程序在最后一个窗口关闭时终止。

    【讨论】:

    • 我认为这是隐含在问题中的,但是我将如何关闭它并结束程序呢?
    猜你喜欢
    • 2023-01-24
    • 2021-05-09
    • 2020-10-17
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多