pyqt QbuttonGroup: передача пользовательских данных по кнопке clicked

Я определил свой собственный класс, который наследует QbuttonGroup

class TupleButtonGroup(QtGui.QButtonGroup):
    def __init__(self,parent, tuple_pair):
        super(TupleButtonGroup, self).__init__(parent)
        self.tuple_pair = tuple_pair

И по нажатию кнопки я хочу получить доступ к данным пользователя tuple_pair и соответствующей кнопке, нажатой в группе кнопок

button_group.buttonClicked[QtGui.QAbstractButton].connect(self.labelchanged)

def labelchanged(self, button):
   print button.text()

Функция получает нажатие кнопки, но я не знаю, как получить доступ к данным пользователя в обратном вызове

2 ответа

Решение

Все кнопки имеют метод group(), который позволяет вам получить ссылку на любую группу (если есть), в которую они были добавлены. Таким образом, ваш код может быть просто:

button_group.buttonClicked.connect(self.labelchanged)

def labelchanged(self, button):
    print button.text()
    print button.group().tuple_pair

И обратите внимание, что вам не нужно указывать QAbstractButton при подключении сигнала, потому что это перегрузка по умолчанию.

Вы могли бы сделать это несколькими способами.

Вы могли бы поймать buttonClicked сигнал в вашем подклассе и излучать свой собственный сигнал, который содержит tuple_pair,

class TupleButtonGroup(QtGui.QButtonGroup):
    buttonClickedWithData = QtCore.pyqtSignal(tuple, QtGui.QAbstractButton)

    def __init__(self,parent, tuple_pair):
        super(TupleButtonGroup, self).__init__(parent)
        self.tuple_pair = tuple_pair
        self.buttonClicked[QtGui.QAbstractButton].connect(self.on_buttonClicked)

    @QtCore.pyqtSlot(QtGui.QAbstractButton)
    def on_buttonClicked(self, button):
        self.buttonClickedWithData.emit(self.tuple_pair, button)

Затем просто подключитесь к этому новому сигналу

button_group.buttonClickedWithData.connect(self.labelchanged)

@QtCore.pyqtSlot(tuple, QtGui.QAbstractButton)
def labelchanged(self, tuple_pair, button):
    print tuple_pair
    print button.text()

Другой вариант - использовать существующий класс, сигналы и слоты и использовать .sender() метод, чтобы получить ссылку на группу кнопок из метода слота.

@QtCore.pyqtSlot(QtGui.QAbstractButton)
def labelchanged(self, button):
    btngroup = self.sender()
    print btngroup.tuple_pair
    print button.text()
Другие вопросы по тегам