7

我正在设计一个自定义小部件,它基本上是一个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装饰器来指定要连接到给定插槽的信号,但这是针对您正在创建的插槽。当插槽来自“现成”类时该怎么办?唯一的选择是继承它,然后用正确的装饰器重新实现给定的插槽?

4

1 回答 1

18

在浏览相关问题时,我发现这个答案正是我所需要的。仅将 QButtonGroup 的 buttonClicked(int)信号连接到QBitArray 的 toggleBit(int)的正确新型信号语法,忽略其他重载签名,涉及在括号中指定所需的类型,如下所示:

self.buttonGroup.buttonClicked[int].connect(self.bitArray.toggleBit)
于 2012-06-24T15:46:20.007 回答