PyQt5:当从QSystemTrayIcon调用QMessageBox作为菜单操作时,QApplication意外退出



下面的代码是我正在编写的代码的简化版本。此PyQt5代码的目的是在某些系统维护过程运行时在系统托盘中显示一个图标,并为用户提供在维护过程正常完成之前终止维护过程的机会,例如,当维护过程需要很长时间才能完成时就会出现这种情况。

下面的代码演示了我遇到的问题。MenuItem2在被调用时创建一个QMessageBox,要求用户单击";ok";或";取消";。当接收到用户的响应时,整个QApplication终止。我不知道为什么会发生这种事。我添加time.sleep(2(只是为了证明QMessageBox工作得很好;如果";QMessageBox.exec((之后的块在QApplication正常工作的情况下正常执行;如果";块被执行并且dialog_ok_cancel((函数完成整个Q应用程序终止,这通过在";如果";块

相反,MenuItem1运行良好,并且QApplication继续运行。这是代码:

import sys, time
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtWidgets import QSystemTrayIcon, QApplication, QMenu, QMessageBox
def menuitem1_action():
print('MenuItem1 chosen')
def dialog_ok_cancel():
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Warning)
msgBox.setText('Do you really want to terminate this process?')
msgBox.setWindowTitle('Confirm your choice')
msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
returnValue = msgBox.exec()
time.sleep(2)
if returnValue == QMessageBox.Ok:
print('OK clicked')
else:
print('Cancel clicked')
class SystemTrayIcon(QSystemTrayIcon):
def __init__(self, icon):
QSystemTrayIcon.__init__(self, icon)
menu = QMenu()
item1 = menu.addAction('MenuItem1')
item1.triggered.connect(menuitem1_action)
item2 = menu.addAction('MenuItem2')
item2.triggered.connect(dialog_ok_cancel)
self.setContextMenu(menu)

app = QApplication(sys.argv)
trayIcon = SystemTrayIcon(QtGui.QIcon('gtk-save.png'))
trayIcon.show()
app.exec()

我不介意当用户点击";好的";。问题是当用户点击"时应用程序终止;取消";尽管上面的代码中没有任何内容导致QApplication退出。

找到了答案。从";Q应用程序";类别:

当最后一个窗口成功关闭时,应用程序退出;这可以通过将quitOnLastWindowClosed设置为false来关闭。

显然,QSystemTrayIcon不符合窗口的条件。在调用MenuItem2时打开的对话框窗口是唯一的窗口;好的";或";取消";,则整个Q应用程序退出。

添加

app.setQuitOnLastWindowClosed(False)

"紧下方";app=QApplication(sys.argv(";解决了问题。

最新更新