2017-03-30 16 views
0

私はPyQtのGUIを持っていますが、これには複数の方法があります。そのような2つの方法は、窓からXが外れた場合、または特定のタスクを完了した場合です。 QMainWindowから拡張されたクラスは、closeEventメソッドを実装しています。PyQtでcloseEventのトリガーを検出する

Xをウィンドウ外に使用している場合は、終了したいと思っているかどうかを確認したい場合は、「はい」と答えてクリーンアップして閉じます。

特定のタスクを完了した場合は、クリーンアップをやり直すだけです。

は今のところ私のcloseEventは次のようになります。この特定のセットアップで

def closeEvent(self, event): 
    # Ask the user if they actually want to quit using custom message box 
    msg = MessageBox(self, 'Are you sure you want to quit?', title = 'Quit', buttons = QMessageBox.Yes|QMessageBox.No) 
    if msg.reply == QMessageBox.Yes: 
     # 
     # Do some cleanup here 
     # 
     super().close() 
    else: 
     event.ignore() 

を、彼らは彼らが窓の外にXする際に必要となる、クローズすることを確認している場合、それは常に求められます。彼らが特定のタスクを完了したら、私は彼らが終了したいと思うだけで、この質問をしなくても、クリーンアップとクローズプロセスにジャンプしたいと思っています。

私の考えは、いくつかの密接なケースでは、必要なタスクを行う別の関数にそれらを導いてから、closeメソッドを呼び出します。しかし、ここでの問題は、closeメソッドを呼び出す前に、Xoutプロセスを別のメソッドに向ける方法がわかりません。今のように、Xoutクローズメソッドの一部として必要であるため、終了したいと確信しているかどうかを常に確認します。

私は何をしようとしていますか?

+0

あなたの質問はより正確です。 – eyllanesc

答えて

1

解決方法は、を使用すると、closeEventを実行せずにアプリケーションを終了することです。

たとえば、次のスクリプトは2つの方法で閉じることができます。最初のものはbtnという新しいボタンで、もう1つはボタンXです。最初のケースではダイアログを呼び出すスロットに接続します。私はqApp.quitでアプリケーションを終了します.2番目のケースは実装したケースと似ています。

from PyQt5.QtWidgets import * 
from PyQt5.QtGui import * 
from PyQt5.QtCore import * 

import sys 

class MainWindow(QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent=parent) 
     btn = QPushButton("close") 
     self.setCentralWidget(btn) 
     btn.clicked.connect(self.closeByButton) 

    def closeByButton(self): 
     msgBox = QMessageBox() 
     msgBox.setText("new Method") 
     msgBox.setStandardButtons(QMessageBox.Cancel | QMessageBox.Yes | QMessageBox.No); 
     msgBox.setDefaultButton(QMessageBox.Yes); 
     if msgBox.exec_() == QMessageBox.Yes: 
      qApp.quit() 

    def closeEvent(self, event): 
     msgBox = QMessageBox() 
     msgBox.setText("Button X Method") 
     msgBox.setStandardButtons(QMessageBox.Cancel | QMessageBox.Yes | QMessageBox.No); 
     msgBox.setDefaultButton(QMessageBox.Yes); 
     if msgBox.exec_() == QMessageBox.Yes: 
      event.accept() 
     else: 
      event.ignore() 


app = QApplication(sys.argv) 
w = MainWindow() 
w.show() 
sys.exit(app.exec_()) 
+0

これは動作する可能性があります。私の主な難しさは、私がこのGUIを持っているクラスがQApplicationオブジェクトとは別のファイルに入っているからです。それは醜く退屈なことですが、私はそれを全面的に伝えることができます。とにかくQMainWindowがQApplicationオブジェクトについて知っていますか? – zephyr

+0

qAppはすべての面からアクセス可能です。 – eyllanesc

+0

私の解決策を試してみて、それが動作するかどうか教えてください – eyllanesc

関連する問題