2014-07-02 39 views
4

首先,我是一個完整的PyQt新手。正確的方法來處理主窗口中的關閉按鈕PyQt,(紅色的「X」)

我一直在嘗試將一個函數鏈接到主窗口的關閉按鈕(窗口角落的紅色x),但我一直沒有取得任何成功。現在,我的代碼看起來是這樣的:

class Ui_MainWindow(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.setupUi(self) 
    def setupUi(self, MainWindow): 
     #setup code goes here 
    def retranslateUi(self, MainWindow): 
     #re translation of the GUI code 
    def closeEvent(self, event): 
     print "User has clicked the red x on the main window" 

在一個單獨的「主」文件我已經如下因素:

class GUIForm(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QMainWindow.__init__(self,parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 
     #self.ui.ECUStatus_txt = MyWidget.__init__.text_list 
     self.threadData() 


    if __name__ == "__main__": 

     app = QtGui.QApplication(sys.argv) 
     myapp = GUIForm() 
     myapp.show() 
     ret = app.exec_() 
     sys.exit(ret) 

然而,當我通過命令提示符下運行,我不能當我點擊紅色的x時看到打印聲明。我知道我對Qt是新手,但是我看到很多人提出這個問題,而且沒有一個答案似乎超出了上面已經寫過的內容。

其中一個答案: Answer #1 Answer #2

這兩種解決方案都與我相似,但它仍然無法正常工作

儘管答案,這可能是該用戶的特定代碼工作,我的PyQt同事和我的同事對我們不工作的推理仍然十分模糊。 PyQt內置的「Red X box」是否有定義的按鈕名稱?我可以將它連接到另一個功能,我會爲其他按鈕做些什麼?

+0

也許'aboutToQuit'信號是你在找什麼? http://qt-project.org/doc/qt-5/qcoreapplication.html#aboutToQuit – user3419537

+0

可能在你的代碼中,你缺少連接信號到插槽。這是Qt庫的「骨幹」。 –

+0

@ user3419537,我試試看! – sudobangbang

回答

7

您不應該修改從您的ui文件生成的類。相反,你應該繼承和修改子類。

從你的代碼的外觀,你實際上是創建兩個QMainWindow s和closeEvent被抓到錯誤的(大概是一個隱藏?)。那是self.ui是一個QMainWindow沒有被顯示,並沒有被添加到GUIForm的UI。相反,您自己明確使用Ui_MainWindow.setupUi()方法,將小部件添加到您自己的QMainWindow'GUIForm`中。

相反,你應該做的就是離開你的Ui_MainWindow類,因爲它是當它被從UI文件生成,然後修改你的主Python文件是:

class GUIForm(Ui_MainWindow): 
    def __init__(self, parent=None): 
     Ui_MainWindow.__init__(self, parent) 
     self.threadData() 

    def closeEvent(self, event): 
     print "User has clicked the red x on the main window" 
     event.accept() 


if __name__ == "__main__": 

    app = QtGui.QApplication(sys.argv) 
    myapp = GUIForm() 
    myapp.show() 
    ret = app.exec_() 
    sys.exit(ret) 

要擴展這樣自動生成的UI文件的行爲。這使得從.ui文件重新生成python文件變得容易,而不必重新添加代碼(這正是爲什麼你永遠不應該修改自動生成的Python文件)

2

有時,處理事件信號時發生問題主窗口。

您可以使用代碼:

app.aboutToQuit.connect(self.closeEvent) 

,你可以在的closeEvent函數編寫自己的代碼。

注:

應用QtGui.QApplication例如

這裏的名稱是完整的代碼演示:

from PyQt4 import QtCore, QtGui 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(800, 600) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

     #{================================ 

     app.aboutToQuit.connect(self.closeEvent) 

     #}================================ 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle('Demo') 

    #{================================ 

    def closeEvent(self): 
     #Your desired functionality here 
     print('Close button pressed') 
     import sys 
     sys.exit(0) 

    #}================================ 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

希望它有幫助。

相關問題