Могу ли я получить сигнал от QGroupbox, когда одна из радиокнопок в нем изменяется? - PullRequest
0 голосов
/ 09 ноября 2019

Я создаю пользовательский интерфейс в PYQT 5. Он включает QGroupBox, содержащий несколько QRadioButton. Когда происходит переключенное событие, я проверяю кнопки и делаю некоторые вещи. Проблема в том, что есть два переключаемых события, потому что одна кнопка включена и одна выключена, поэтому мой код всегда выполняется дважды.

Вместо этого я искал событие из QGroupBox. Это должно происходить только один раз, а не дважды, когда я переключаю радиокнопку.

    def __init__(self):
        self.radioButton1.toggled.connect(self.update_stimulus)
        self.radioButton2.toggled.connect(self.update_stimulus)
        self.radioButton3.toggled.connect(self.update_stimulus)

    def update_stimulus(self):
        if self.radioButton1.isChecked():
            print('1')
        if self.radioButton2.isChecked():
            print('2')
        if self.radioButton3.isChecked():
            print('3')
        # Do stuff based on button positions

Я пытался использовать

self.groupBox.toggled.connect(self.update_stimulus)

Но это работает, только если сам групповой блок переключается. Есть ли способ получить сигнал от групповой коробки, когда одна из радиокнопок изменяется, или мне нужно найти какой-то способ сделать это с отдельными сигналами от радиокнопок?

1 Ответ

1 голос
/ 09 ноября 2019

Как объясняет @ ekhumoro , вы можете добавить параметр checked в функцию и выполнять свою обработку, только если он True:

def update_stimulus(self, checked):
    if not checked:
        return
    if self.radioButton1.isChecked():
        print('1')
    if self.radioButton2.isChecked():
        print('2')
    if self.radioButton3.isChecked():
        print('3')

Имейте в виду, хотячто если вы хотите, чтобы в одном и том же групповом блоке были разные "группы" переключателей, то все это не будет работать должным образом, поскольку все они будут рассматриваться как часть одной и той же группы: все кнопки Qt (виджеты, которые наследуют QAbstractButton: QPushButton, QToolButton, QCheckBox и QRadioButton) имеют свойство autoExclusive , которое по умолчанию отключено, кроме переключателей. Это свойство делает все кнопки, принадлежащие одному и тому же родительскому виджету, автоматически исключающими.

Если вам нужны разные группы в одном и том же родительском элементе, решение состоит в использовании QButtonGroup, который расширяетисключительная функциональность, ограничивая членство каждой кнопки в определенной группе.

def __init__(self):
    # ...
    self.buttonGroupA = QtWidgets.QButtonGroup()
    self.buttonGroupA.addButton(self.radioButton1)
    self.buttonGroupA.addButton(self.radioButton2)
    self.buttonGroupA.addButton(self.radioButton3)
    self.buttonGroupA.buttonToggled[QtWidgets.QAbstractButton, bool].connect(self.update_stimulusA)

    self.buttonGroupB = QtWidgets.QButtonGroup()
    self.buttonGroupB.addButton(self.radioButton4)
    self.buttonGroupB.addButton(self.radioButton5)
    self.buttonGroupB.addButton(self.radioButton6)
    self.buttonGroupB.buttonToggled[QtWidgets.QAbstractButton, bool].connect(self.update_stimulusB)

def update_stimulusA(self, btn, checked):
    if not checked:
        return
    # do something with group A

def update_stimulusB(self, btn, checked):
    if not checked:
        return
    # do something with group B

Создание группы кнопок также возможно из Designer: просто выберите по крайней мере две кнопки, которые будут членами одной группы, вернощелкните по одному из них, перейдите в подменю «Назначить группе кнопок» и выберите «Новая группа кнопок». Чтобы добавить кнопку в существующую группу, просто используйте то же контекстное меню и выберите группу, в которую вы хотите добавить эту кнопку.

...