2017-05-21 24 views
1

私は、主にQSystemTrayIconに基づいている単純なスクリプトを持っています。すべてが動作し、プログラムを終了するタスクバーアイコンを右クリックするとそこにオプションがあります。私はQMessageBoxを追加したいと思います。そしてyesを選択すると、プログラムは終了します。それ以外の場合は何もしないでください。PyQt:QMessageBoxの後にQSystemTrayIconプログラムを終了します。

私はこのすべてに精通していますが、それはうまくいかないので、問題ではありません。私は、問題を示すために、最小限の例を作成しました:

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() 

は今、あなたは、私が(コード0、エラーなしで)yesまたはno、プログラムが終了を選択するかどうか、slot_exit()機能で、参照してください。コメントされた部分は、その選択に基づいてアクションを決定するために使用されることが期待される部分です。なぜこの現象が起こっているのか、「はい」だけで終了する正しい方法は何かを理解するのを助けてください。

私はWindows 10、Python Anaconda 3.5.2 32ビット、PyQt 5.7で64ビットを使用しています。

+0

非常に驚くべき誰もこれを見ていない!私は問題を再現することができます。 –

+0

@TheQuantumPhysicist私はそれをバグと呼ぶのは嫌ですが、そのように思えます。なぜQMessageBoxに答えるだけでそれが終了するのですか? –

答えて

1

問題は、すべてのWindowsが終了したときにQtが終了することです。

app.setQuitOnLastWindowClosed(False) 

あなたのmain()でそれを単に無効にしてください。

+0

それはそれでした!ありがとう! –

関連する問題