如何从QToolBox获取子类QWidgets?
我写了一些自定义的小部件类,通过继承 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()
但是,由于 QToolBox
的 widget()
方法只返回 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_())