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

2024-09-19 23:33:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设计一个自定义小部件,它基本上是一个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,我想使用新样式的signals语法,所以我尝试了以下方法:

^{pr2}$

问题是buttonClicked是一个过载信号,因此也存在buttonClicked(QAbstractButton*)签名。事实上,当程序执行时,当我单击某个复选框时会出现以下错误:

The debugged program raised the exception unhandled TypeError
"QBitArray.toggleBit(int): argument 1 has unexpected type 'QCheckBox'"

这清楚地显示了toggleBit方法接收到的按钮被点击(QAbstractButton*)信号,而不是按钮点击(int)信号。在

所以,问题是,如何使用新的语法来指定信号连接,以便self.bitArray接收buttonClicked(int)信号,而不是默认的过载-buttonClicked(QAbstractButton*)?在

编辑:您可以使用pyqtSlot修饰符来指定要连接到给定插槽的信号,但这是您正在创建的插槽的信号。当插槽来自“现成”类时该怎么办?唯一的选择是将其子类化,然后用正确的修饰符重新实现给定的插槽吗?在


Tags: theself信号按钮numbitsint插槽
1条回答
网友
1楼 · 发布于 2024-09-19 23:33:49

在浏览相关问题时,我发现this answer正是我需要的。对于只将QButtonGroup的buttonClicked(int)信号连接到QBitArray的toggleBit(int)的正确新型信号语法包括在括号中指定所需的类型,如下所示:

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

相关问题 更多 >