2017-02-25 53 views
0

幾周以來,我一直在爲一些衆所周知的GIS免費軟件(QGIS)編寫一個插件。我遇到了一些小問題。PyQt4 |處理'X' - 在QDialog中退出按鈕

我的插件機制是這樣的:

....... 
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 

我知道這是不是建立理所應當的,但我是初學者。沒問題的是,這個插件工作的非常好,而且我在編寫它的過程中已經走得太遠,無法改變程序的整個結構。

我正在尋找的(到目前爲止找不到的)是一種處理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'的子類呢?我如何說我想重寫'QDialog'的'closeEvent'方法而不是'QMainWindow'。 – Blinxen