使用新式语法连接超载的PyQT信号

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以便相应数组中的位可以被设置/取消设置。为此,我打算将QButtonGroupbuttonClicked(int)信号连接到QBitArraytoggleBit(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装饰器来指定要连接到给定槽的信号,但这只适用于您正在创建的槽。如果所提供的槽来自“现成”的类,该怎么办?唯一的选项是对其进行子类化,然后使用正确的装饰器重新实现给定的槽吗?

1个回答

19

在浏览相关问题时,我发现这个答案正是我所需要的。连接仅将QButtonGroupbuttonClicked(int)信号与QBitArraytoggleBit(int)信号进行新样式连接的正确语法,忽略其他重载签名,需要在括号中指定所需类型,像这样:

self.buttonGroup.buttonClicked[int].connect(self.bitArray.toggleBit)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接