如何从QToolBox获取子类QWidgets?

0 投票
1 回答
666 浏览
提问于 2025-04-17 22:11

我写了一些自定义的小部件类,通过继承 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()

但是,由于 QToolBoxwidget() 方法只返回 QWidget 类型的对象,当我尝试调用 toolboxWidget 对象的 printMethod() 方法时,就出现了以下错误:

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

有没有办法把 widget() 返回的 QWidget 转换成 BaseWidget 对象呢?谢谢。

1 个回答

0

在修正了你示例代码中所有明显的错误和遗漏后,我成功让它正常工作了。

如果 QToolBox.widget 方法没有返回你自定义的 BaseWidget 子类的实例,那就可能是 PyQt(或者 sip)里的一个bug。

下面是一个我在使用 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_())

撰写回答