我正在设计一个自定义小部件,它基本上是一个 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 ,以便通知数组可以相应地设置/取消设置。为此,我打算将<strong> QButtonGroup的 buttonClicked(int)信号连接到 QBitArray的 toggleBit(int)方法,并且尽可能使用pythonic,我想使用新式的信号语法,所以我尝试了这个:
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's New-style Signal and Slot Support documentation状态您可以使用 pyqtSlot 装饰器来指定要连接到给定插槽的信号,但这是用于插槽的你正在创造。当插槽来自“现成”类时该怎么办?唯一的选择是继承它,然后用正确的装饰器重新实现给定的插槽吗?
答案 0 :(得分:17)
在浏览相关问题时,我发现this answer正是我所需要的。正确的新式信号语法,用于仅将 QButtonGroup的 buttonClicked(int)信号连接到 QBitArray的 toggleBit(int) ,忽略其他重载的签名,涉及在括号中指定所需的类型,如下所示:
self.buttonGroup.buttonClicked[int].connect(self.bitArray.toggleBit)