我正在设计一个自定义小部件,它基本上是一个QGroupBox ,其中包含可配置数量的QCheckBox按钮,其中每个按钮都应控制由QBitArray表示的位掩码中的特定位。为了做到这一点,我将QCheckBox实例添加到QButtonGroup,每个按钮都有一个整数 ID:
def populate(self, num_bits, parent = None):
"""
Adds check boxes to the GroupBox according to the bitmask size
"""
self.bitArray.resize(num_bits)
layout = QHBoxLayout()
for i in range(num_bits):
cb = QCheckBox()
cb.setText(QString.number(i))
self.buttonGroup.addButton(cb, i)
layout.addWidget(cb)
self.setLayout(layout)
然后,每次用户单击self.buttonGroup中包含的复选框时,我希望self.bitArray得到通知,以便可以相应地设置/取消设置数组中的相应位。为此,我打算将QButtonGroup 的 buttonClicked(int)信号连接到QBitArray 的 toggleBit(int)方法,并且为了尽可能地使用 Python,我想使用新型信号语法,所以我尝试了这个:
self.buttonGroup.buttonClicked.connect(self.bitArray.toggleBit)
问题是buttonClicked是一个重载信号,所以还有buttonClicked(QAbstractButton*)签名。实际上,当程序执行时,当我单击复选框时会出现此错误:
The debugged program raised the exception unhandled TypeError
"QBitArray.toggleBit(int): argument 1 has unexpected type 'QCheckBox'"
这清楚地显示了toggleBit方法收到的是buttonClicked(QAbstractButton*)信号,而不是buttonClicked(int)信号。
所以,问题是,如何使用新式语法指定信号连接,以便self.bitArray接收buttonClicked(int)信号而不是默认的重载 - buttonClicked(QAbstractButton*)?
编辑:PyQT 的 New-style Signal and Slot Support 文档指出您可以使用pyqtSlot装饰器来指定要连接到给定插槽的信号,但这是针对您正在创建的插槽。当插槽来自“现成”类时该怎么办?唯一的选择是继承它,然后用正确的装饰器重新实现给定的插槽?