【问题标题】:Connecting an overloaded PyQT signal using new-style syntax使用新式语法连接重载的 PyQT 信号
【发布时间】:2018-12-31 10:44:20
【问题描述】:

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

【问题讨论】:

    标签: pyqt4 python signals-slots


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-20
      • 2013-12-31
      • 2013-07-14
      • 2011-08-07
      • 1970-01-01
      • 2016-10-11
      • 2016-11-03
      相关资源
      最近更新 更多