首页 > 解决方案 > 关闭 QMainWindow 的正确方法

问题描述

我最近从 tkinter 更改为 Pyqt5,因为我正在 Python 3.7.8 中开发一个半大型应用程序

每次我不得不关闭窗口时,我都会使用该方法self.destroy(),当我关闭所有程序并且没有窗口时,解释器仍在运行,我需要手动终止进程,即使使用sys.exit(app.exec_())

我可以让程序运行 15 秒或 30 分钟,这完全是随机的。

我刚刚看到另一种方法称为self.close(),所以我self.destroy()用它替换了 ,但我不确定这是否是预期的做法,或者是否有更好的方法。我仍然需要检查问题是否再次出现。

使用pyqt5 应用程序self.destroy还是更好?self.close有没有更好的办法?

标签: pythonpyqtpyqt5

解决方案


close()

关闭此小部件。

destroy()

释放窗口系统资源。[...] 这个函数通常从 QWidget 析构函数中调用。

如果你close()是小部件,如果需要,它可以在以后再次打开/显示,如果小部件是顶级窗口并且是最后一个可见的窗口,Qt 将自动退出应用程序(假设 QApplication 有quitOnLastWindowClosed()设置,这是默认设置行为)。在这种情况下,PyQt 将自动销毁窗口并释放内存,这意味着destroy()无论如何都会调用它。

请注意,如果窗口没有其他引用或父窗口,它也会在关闭时自动销毁:与任何其他 python 对象一样,垃圾收集器将删除窗口小部件及其子窗口,这会导致调用 QWidget 销毁器。

因此,您应该始终调用close(),因为它确保 Qt 遵循正确的步骤:发送 QCloseEvent(如果需要,可以忽略)并通知应用程序,以便在窗口是最后一个窗口时它可以实际退出。


推荐阅读