代码之家  ›  专栏  ›  技术社区  ›  user110

如何从QToolBox获取子类QWidget?

  •  0
  • user110  · 技术社区  · 10 年前

    我通过子类化编写了一些定制的小部件类 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(QWidget) 类型,调用时 printMethod() 属于 toolboxWidget 对象,则会给出以下错误:

    AttributeError:“QWidget”对象没有属性“mymethod”。

    有没有方法可以转换 QWidget(QWidget) 由返回 小部件() BaseWidget 物体?谢谢

    1 回复  |  直到 10 年前
        1
  •  0
  •   ekhumoro    10 年前

    在修复了示例代码中所有明显的错误和遗漏之后,我能够让它毫无问题地工作。

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