2017-05-21 9 views
1

J'ai un script simple principalement basé sur QSystemTrayIcon. Tout fonctionne, et il y a une option là-bas avec le bouton droit de la souris sur l'icône de la barre des tâches qui quitte le programme. Je voudrais ajouter un QMessageBox, et en choisissant oui, quittez le programme; Sinon, ne faites rien. Je connais tout cela, mais cela ne fonctionne pas comme il se doit, et donc la question. J'ai créé un exemple minimal pour démontrer le problème:PyQt: Quitter le programme QSystemTrayIcon après 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() 

Maintenant, vous voyez, à la fonction slot_exit(), si je choisis oui ou non, les sorties du programme (avec le code 0, aucune erreur). La partie commentée est ce que je compte utiliser pour déterminer l'action en fonction du choix. Pourriez-vous s'il vous plaît m'aider à comprendre pourquoi ce comportement se produit et quelle est la bonne façon de sortir seulement sur "oui"? J'utilise Windows 10, 64 bits avec Python Anaconda 3.5.2 32 bits et Python 5.7.

+0

Assez surprenant personne n'a même regardé cela! Je peux reproduire le problème. –

+0

@TheQuantumPhysicist Je suis réticent à l'appeler un bug, mais ça sonne comme un. Pourquoi sortirait-il juste en répondant à un QMessageBox? –

Répondre

1

Le problème est que Qt est fait pour quitter lorsque toutes les fenêtres sont fermées. Il suffit de désactiver cela avec:

app.setQuitOnLastWindowClosed(False) 

dans votre main().

+0

C'était tout! Merci! –