Подключение перегруженного сигнала PyQT с использованием синтаксиса нового стиля

Я разрабатываю собственный виджет, который в основном представляет собой QGroupBox, содержащий настраиваемое количество кнопок QCheckBox, где каждая из них должна управлять определенным битом в битовой маске, представленнойQBitArray. Для этого я добавил экземпляры QCheckBoxвQButtonGroup, при этом каждой кнопке был присвоен целочисленный идентификатор:

    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*)вместо кнопка Clicked(int)один.

Итак, вопрос в том, как я могу указать соединение сигнала, используя синтаксис нового стиля, чтобы self.bitArrayполучал buttonClicked(int)вместо перегрузки по умолчанию — buttonClicked(QAbstractButton*)?

РЕДАКТИРОВАТЬ: В документации по поддержке сигналов и слотов в новом стиле PyQTуказано, что вы можете использовать декораторы pyqtSlot, чтобы указать, какой сигнал вы хотите подключить к данному слоту, но это для слота, который вы создаете. Что делать, когда слот из класса «готовый»? Является ли единственным вариантом его подкласс, а затем повторная реализация данного слота с правильным декоратором?

6
задан Claudio 23 June 2012 в 22:00
поделиться