Я разрабатываю собственный виджет, который в основном представляет собой 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, чтобы указать, какой сигнал вы хотите подключить к данному слоту, но это для слота, который вы создаете. Что делать, когда слот из класса «готовый»? Является ли единственным вариантом его подкласс, а затем повторная реализация данного слота с правильным декоратором?