2014-03-13 47 views
0

我通過子類QWidget編寫了一些定製的窗口小部件類。我使用它們創建了一些定製小部件,並將它們添加到QToolBox。如何從QToolBox獲取子類QWidgets?

class BaseWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     # initialize 

    def mymethod(): 
     pass 

class AWidget(BaseWidget): 
    def __init__(self, parent=None): 
     # initialize 

    def mymethod(): 
     print "A" 

class BWidget(BaseWidget): 
    def __init__(self, parent=None): 
     # initialize 

    def mymethod(): 
     print "B" 

現在我想遍歷所有加入QToolBox並調用這些定製的微件的方法的部件:

class toolboxWidget(QtGui.QToolBox): 
    def __init__(self, parent=None): 
     super(toolboxWidget, self).__init__(parent=parent) 
     a = AWidget(self) 
     b = BWidget(self) 
     self.addItem(a, "A") 
     self.addItem(b, "B") 

    def printMethod(self): 
     for i in range(self.count()): 
      self.widget(i).mymethod() 

然而,由於QToolBoxwidget()方法只返回QWidget類型的對象,當調用printMethod()toolboxWidget對象時,它給出以下錯誤:

AttributeError:'QWidget'對象沒有屬性'mymethod'。

有沒有辦法將widget()返回的QWidget轉換爲BaseWidget對象?謝謝。

+0

在發佈示例代碼,請包括_actual code_引起該問題,並_full_回溯。 – ekhumoro

回答

0

修復了示例代碼中的所有明顯錯誤和遺漏之後,我能夠毫無問題地完成工作。

如果QToolBox.widget方法沒有返回您的BaseWidget子類之一的實例,那將是PyQt(或sip)中的一個錯誤。

下面是我使用SIP 4.15.4和4.10.3 PyQt的工務局的腳本:

from PyQt4 import QtCore, QtGui 

class BaseWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 

    def mymethod(self): 
     pass 

class AWidget(BaseWidget): 
    def __init__(self, parent=None): 
     BaseWidget.__init__(self, parent) 

    def mymethod(self): 
     print "A" 

class BWidget(BaseWidget): 
    def __init__(self, parent=None): 
     BaseWidget.__init__(self, parent) 

    def mymethod(self): 
     print "B"  

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.toolbox = QtGui.QToolBox(self) 
     a = AWidget(self.toolbox) 
     b = BWidget(self.toolbox) 
     self.toolbox.addItem(a, "A") 
     self.toolbox.addItem(b, "B") 
     self.button = QtGui.QPushButton('Test', self) 
     self.button.clicked.connect(self.printMethod) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.toolbox) 
     layout.addWidget(self.button) 

    def printMethod(self): 
     for i in range(self.toolbox.count()): 
      self.toolbox.widget(i).mymethod() 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(500, 300, 300, 300) 
    window.show() 
    sys.exit(app.exec_())