PyQt:在QMessageBox后退出QSystemTrayIcon程序

4
我有一个基于QSystemTrayIcon的简单脚本。一切都很好,右键单击任务栏图标时会出现退出程序的选项。我想添加一个QMessageBox,并在选择是时退出程序;否则,什么也不做。
我对这些都很熟悉,但它没有按照应该的方式工作,因此我提出了问题。我创建了一个最小化示例来演示问题:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class SystemTrayIcon(QtWidgets.QSystemTrayIcon):
    def __init__(self, icon, parent=None):
        QtWidgets.QSystemTrayIcon.__init__(self, icon, parent)
        self.menu = QtWidgets.QMenu(parent)
        self.exit_action = self.menu.addAction("Exit")
        self.setContextMenu(self.menu)
        self.exit_action.triggered.connect(self.slot_exit)

        self.msg_parent = QtWidgets.QWidget()

    def slot_exit(self):
        reply = QtWidgets.QMessageBox.question(self.msg_parent, "Confirm exit",
                                               "Are you sure you want to exit Persistent Launcher?",
                                               QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
        # if reply == QtWidgets.QMessageBox.Yes:
        #     QtCore.QCoreApplication.exit(0)


def main():
    app = QtWidgets.QApplication(sys.argv)

    tray_icon = SystemTrayIcon(QtGui.QIcon("TheIcon.png"))

    tray_icon.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

现在你看到,在slot_exit()函数中,无论我选择是或否,程序都会退出(退出代码为0,没有错误)。注释部分是我希望用来基于选择确定操作的内容。你能帮我弄清楚这种行为发生的原因以及只在“是”上正确退出的方法吗?
我使用的是Windows 10,64位,Python Anaconda 3.5.2 32位和PyQt 5.7。

非常惊讶,竟然没有人看过这个!我可以重现这个问题。 - The Quantum Physicist
@TheQuantumPhysicist 我不太愿意称之为 bug,但它听起来像一个。为什么只是回答 QMessageBox 就会退出呢? - Sam Markus
1个回答

6
问题在于Qt在所有窗口关闭时默认会退出。只需通过以下方式禁用该功能即可:

QCoreApplication::setAttribute(Qt::AA_QuitOnClose, false);

app.setQuitOnLastWindowClosed(False)

在你的main()函数中。

就这样了!谢谢! - Sam Markus
花了三天时间才找到这个。我觉得我的线程有问题。救了我的一天。我不知道为什么这个问题和答案没有得到足够的关注。 - azzamsa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接