2017-02-25 1 views
0

私は数週間、よく知られているGISフリーソフトウェア(QGIS)のプラグインをコーディングしています。私はそれに少し問題があります。PyQt4 | QDialogの 'X' - exitボタンを処理する

....... 
class DisplayedWindow(object): 

     def __init__(self): 
      #JANEK Main dialog 
      self.window_plugin = QtGui.QDialog() 
      self.window_plugin.setWindowModality(QtCore.Qt.WindowModal) 
      self.window_plugin.setGeometry(150, 150, 750, 675) 
      self.window_plugin.setWindowTitle('the plugin') 
      self.window_plugin.setWindowFlags(Qt.WindowMinimizeButtonHint|Qt.WindowMaximizeButtonHint) 

      ............. (GUI, functions, etc.)....... 

def run(self): 

    dis_win = self.DisplayedWindow() 
    if dis_win.window_plugin.exec_(): 
     pass 

が、私はそれがあるべきように構築されていないことを知っているが、私はbegginerだ:

私のプラグイン方式は、次のようになります。プラグインが本当にうまく機能していて、プログラムの全体構造を変更するためにコーディングするにはあまりにも遠すぎます。

私が探している(これまで見つからなかった)方法は、X-exit赤いボタンを処理する方法です。そのため、ユーザーはウィンドウを閉じる前に尋ねることができます。変更など

私はそれを受け取るためにどのように誰もが知っていself.X_close_button.clicked.connect(lambda: closing_stuff())

ようなものが必要?または、誰かがウィンドウを閉じた後に何が起こるかを制御するためのダイアログ(self.window_plugin)で他の方法を使う?

素晴らしい一日を!

答えて

0

私はあなたのための簡単な例を作った。全体のコードがあります:

import sys 
from PyQt4 import QtGui,QtCore 
from PyQt4.QtGui import * 
from PyQt4.QtCore import * 
class Create_Dialog_Box(QDialog): 
    def __init__(self,parent = None): 
     super(Create_Dialog_Box, self).__init__(parent) 
     self.setGeometry(100,100,500,200) 
    def closeEvent(self,event): 
     quit_msg = "Are you sure you want to exit the dialog?" 
     reply = QtGui.QMessageBox.question(self, 'Message', 
         quit_msg, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) 
     if reply == QtGui.QMessageBox.Yes: 
      event.accept() 
     else: 
      event.ignore() 

app = QtGui.QApplication(sys.argv) 
w = QtGui.QWidget() 
w.setGeometry(100,100,200,50) 

d = Create_Dialog_Box(w) 

b = QtGui.QPushButton(w) 
b.setText("Click Me!") 
b.move(50,20) 
b.clicked.connect(d.show) 


w.setWindowTitle("PyQt") 
w.show() 
print("End") 
sys.exit(app.exec_()) 

次の画像を示すように、それはプロンプトダイアログを終了しようとすると:

enter image description here

はそれがお役に立てば幸いです。

1

QDialogを拡張し、そのcloseEvent()メソッドをオーバーライド:

その後、
class GISDialog(QDialog): 
    def __init__(self, parent=None): 
     super(GISDialog, self).__init__(parent) 

     self.setGeometry(150,150,750,750) 
     self.window_plugin.setWindowTitle('the plugin') 
     # other intitialization 

    def closeEvent(self, event): 
     reply = QMessageBox.question(self, 'Message', 
      "Do you want to save?", QMessageBox.Yes, QMessageBox.No) 

     if reply == QMessageBox.Yes: 
      event.accept() 
     else: 
      event.ignore() 

、あなたがそれを使用する準備ができているとき:

dialog = GISDialog() 
if dialog.exec(): 
    pass # do stuff on success 
+0

おかげで多くのことを、私はまだ問題を抱えています。メインウィンドウはオブジェクトであり、クラスではありません。どうすればこのcloseEvent()メタンを「置き換える」ことができますか? self.window_plugin.closeEvent()= closeEvent() のようなものを試しましたが、エラーが発生します – Janek

+0

私の答えにもう少し情報を追加しました。 – Crispin

+0

'QDialog'が' QMainWindow'のサブクラスである場合はどうなりますか? 'QMainWindow'ではなく' QDialog'の 'closeEvent'メソッドをオーバーライドしたいとします。 – Blinxen

関連する問題