PyQt5 正确销毁一个程序

PyQt5 destroy a program properly

我正在使用 self.setWindowFlags(Qt.Tool) 隐藏任务栏上的应用程序。然而,我意识到即使我按下程序右上角的 x,它仍然在后台显示 运行(我在任务 manager/processes 上看到它)。所以这意味着程序没有正确关闭。这是因为我使用 self.setWindowFlags(Qt.Tool) 吗?我该如何解决这个问题,那个标志选项隐藏了程序的图标,但即使我按 x 关闭程序,它仍然在后台 运行。

在 Qt 中,应用程序将继续 运行,直到主事件循环收到退出信号。在大多数应用程序中,这是在最后一个(或唯一一个)QMainWindow 被销毁时提供的(参见 QApp.setQuitOnLastWindowClosed())。

QMainWindow 上设置 Qt.Tool 标志会清除 WA_QuitOnClose 标志,这意味着关闭 window 将不再发出退出应用程序的信号。但是,您可以将此标志重新打开 as described in this post on the Qt forum

window = QMainWindow(None, Qt.Tool)
window.show() # must be called before setting Qt::WA_QuitOnClose
window.setAttribute(Qt.WA_QuitOnClose)

或者,您也可以使用 QApp.quit().

手动触发退出

我找到了解决方案,制作自己的退出按钮并连接如下信号

self.xbutton = QPushButton(self)
self.xbutton.setText("Quit")
self.xbutton.clicked.connect(self.close)

这会正确销毁应用程序。也可以使用 self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

而不是 Qt.Tool