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

时间:2012-06-23 21:12:07

标签: pyqt4 python signals-slots

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

1 个答案:

答案 0 :(得分:17)

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

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