2013-12-22 50 views
1

我已經在Qt中創建了一個接口作爲.ui文件,然後將其轉換爲python文件。然後,我想爲組件添加一些功能,例如單選按鈕等。爲此,我嘗試從Qt重新實現類並添加我的事件。但它提供了以下錯誤:如何重新實現由Qt生成的Ui_MainWindow

self.radioButton_2.toggled.connect(self.radioButton2Clicked) 
NameError: name 'self' is not defined 

我的第一個問題是,這是否是對付使用Qt生成的類正確/合適的方法是什麼?其次,爲什麼我會得到錯誤?

我的代碼是在這裏:

import sys 
from PySide import QtCore, QtGui 
from InterfaceClass_Test01 import Ui_MainWindow 

class MainInterface(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(MainInterface, self).__init__(parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

    def setupUi(self, MainWindow): 
     super(MainInterface, self).setupUi(parent, MainWindow) 

     self.radioButton.toggled.connect(self.radioButtonClicked) 
     self.radioButton_2.toggled.connect(self.radioButton2Clicked) 
     self.radioButton_3.toggled.connect(self.radioButton3Clicked) 

    def radioButton3Clicked(self, enabled): 
     pass 

    def radioButton2Clicked(self, enabled): 
     pass 

    def radioButtonClicked(self, enabled): 
     pass 

回答

1

生成的文件都有點不直觀。 UI類只是一個簡單的包裝,並不是Qt Designer的頂級小部件的子類(如您所期望的那樣)。

取而代之,UI類有一個setupUi方法,它接收頂級類的實例。此方法將添加Qt Designer中的所有小部件,並將它們的實例屬性(通常爲self)。屬性名稱取自Qt Designer中的objectName屬性。將由Qt給出的默認名稱重置爲更易讀的名稱是個好主意,以便稍後可以很容易地引用它們。 (不要忘記重新生成UI模塊你做出更改後!)

是進口的UI應該結束了尋找這樣的模塊:

import sys 
from PySide import QtCore, QtGui 
from InterfaceClass_Test01 import Ui_MainWindow 

class MainInterface(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(MainInterface, self).__init__(parent) 
     # inherited from Ui_MainWindow 
     self.setupUi(self) 
     self.radioButton.toggled.connect(self.radioButtonClicked) 
     self.radioButton_2.toggled.connect(self.radioButton2Clicked) 
     self.radioButton_3.toggled.connect(self.radioButton3Clicked) 

    def radioButton3Clicked(self, enabled): 
     pass 

    def radioButton2Clicked(self, enabled): 
     pass 

    def radioButtonClicked(self, enabled): 
     pass 
+0

謝謝!是的,它解決了問題!一個問題:MainInterface類有2個參數,這意味着它有2個父母!那麼,如何在使用超級方法運行時知道哪個__init__被調用? –

+1

'MainInterface'類沒有兩個父母:它從兩個基類繼承。 [super](http://docs.python.org/2/library/functions.html#super)調用確保所有基類(和_their_基類等)的__init__被調用正確的順序。 – ekhumoro