我正在设计一个自定义小部件,它基本上是一个可配置的 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)方法,并尽可能地使用新风格信号语法,因此我尝试了以下代码:
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的新式信号与槽支持文档表明,您可以使用pyqtSlot装饰器来指定要连接到给定槽的信号,但这只适用于您正在创建的槽。如果所提供的槽来自“现成”的类,该怎么办?唯一的选项是对其进行子类化,然后使用正确的装饰器重新实现给定的槽吗?