PyQt5. Передача и получение значения RadioButton и ButtonGroup

Подскажите, как правильно выставить и считать одну из нескольких из RadioButton при получении значения из внешнего источника. ButtonGroup позволяет выбрать только одну из объединенных кнопок, но как видно на примере ниже работает из без группы, возможно ли решение задачи через ButtonGroup? Передачу и считавание значения реализовал через словарь, работает, но есть чувство, что все гораздо проще - без костыля из словаря:

Update: Данный способ не позволяет понять какая кнопка выбранна, если выставить значение кнопки вручную, кликнув по Rbutton. Для примера: есть форма из нескольких LineEdit, CheckBox, 4-х RadioButton и кнопки Save для записи данных в БД, можно при нажатии на Save получить все данные кроме RadioButton.

main.py:

import sys
from PyQt5.QtWidgets import *


class MainAppInterface(QMainWindow):

    def __init__(self):

        super().__init__()

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.setMinimumHeight(300)
        self.setMinimumWidth(400)
        self.resize(400, 300)

        self.setWindowTitle("Test")

        self.__main_app_build()

    def __main_app_build(self):

        self.line = QLineEdit()
        self.line.setPlaceholderText("Input 1 or 2 or 3 or 4")
        self.button = QPushButton("Push")
        self.button.clicked.connect(self.set_rbutton)

        self.r1 = QRadioButton("1")
        self.r2 = QRadioButton("2")
        self.r3 = QRadioButton("3")
        self.r4 = QRadioButton("4")

        self.buttons_values = {
            "1": self.r1,
            "2": self.r2,
            "3": self.r3,
            "4": self.r4,
        }

        self.s_button = QPushButton("Save")
        self.s_button.clicked.connect(self.save_param)

        g_layout = QGridLayout(self.centralWidget)
        g_layout.addWidget(self.line, 1, 1)
        g_layout.addWidget(self.button, 1, 2)
        g_layout.addWidget(self.r1, 2, 1)
        g_layout.addWidget(self.r2, 3, 1)
        g_layout.addWidget(self.r3, 4, 1)
        g_layout.addWidget(self.r4, 5, 1)
        g_layout.addWidget(self.s_button, 6, 1)

    def set_rbutton(self):

        rbutton = self.buttons_values[self.line.text()]
        rbutton.setChecked(True)
        print(rbutton.text())

    def save_param(self):

        line_value = self.line.text()
        # Как получить выбранный RadioButton?



if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MainAppInterface()
    ex.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: Alexander Chernin

Док

self.group = QButtonGroup()

# Первый аргумент это сама кнопка. Можно добавить и второй аргумент - некий идентификатор
self.group.addButton(self.r1)
self.group.addButton(self.r2)
self.group.addButton(self.r3)
self.group.addButton(self.r4)

# Так вы получите радио по которому кликнули (lambda - просто для примера. 
# Вы можете использовать любой подходящий метод, или функцию)
self.group.buttonClicked.connect(lambda btn: print(btn.text())

# А так вы получите две радио. Одна - которая стала False, а вторая True)
self.group.buttonToggled.connect(lambda btn, check: print("btn={} state={}".format(btn.text(), check)))

Выбранное радио можно получить при помощи метода QButtonGroup.checkedButton

Дополнение Можно ли чекнуть радио (любую кнопку) программно? Да, можно.

Добавим идентификаторы:

self.group.addButton(self.r1, 1)
self.group.addButton(self.r2, 2)
self.group.addButton(self.r3, 3)
self.group.addButton(self.r4, 4)

Теперь, где-то вы хотите изменить значение, допустим, третьего радио. Воспользуемся QGroupButton.button:

# Получаем кнопку по id
radio3 = self.group.button(3)
radio3.setChecked(True)
→ Ссылка