如何从QToolBox获取子类QWidgets?

时间:2014-03-13 18:06:21

标签: python pyqt4 subclass qwidget

我通过继承QWidget编写了一些自定义的小部件类。我使用它们创建了一些自定义小部件,并将它们添加到QToolBox中。

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()

但是,由于widget() QToolBox方法仅返回QWidget类型的对象,因此在调用printMethod()对象的toolboxWidget时,会出现以下错误:

AttributeError:'QWidget'对象没有属性'mymethod'。

有没有办法可以将QWidget返回的widget()转换为BaseWidget个对象?感谢。

1 个答案:

答案 0 :(得分:0)

在解决了示例代码中的所有明显错误和遗漏之后,我能够毫无问题地使其正常运行。

如果QToolBox.widget方法没有返回一个BaseWidget子类的实例,那么这将是PyQt(或sip)中的错误。

这是一个适用于我的脚本,使用sip 4.15.4和PyQt 4.10.3:

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_())