Путаница сигнала RadioBox - PullRequest
2 голосов
/ 25 мая 2020

Я пробовал создать мульти QRadioButton в разных QGroupBox. После этого я хотел бы print(), который QRadioButton нажал на экране.

Когда я нажимаю sh первую кнопку в QGroupBox, проблем нет. Однако при второй попытке первая и вторая кнопки выводятся на экран. Если вы попробуете мой код, вы увидите, что я имел в виду

После того, как код заработает, я подключу разные функции для каждого QRadioButton. Вот почему выходной сигнал для меня важен

Вот мой код:

from PyQt5.QtWidgets import *


import sys


class ButtonWidget(QWidget):

    def __init__(self):
        super(ButtonWidget, self).__init__()

        groups = {"Functions": ("Sinus", "Cosines"),
                  "Colors": ("Red", "Green"),
                  "Lines": ("Solid", "Dashed")
                  }

        # Main Group
        main_group = QGroupBox("Operations")
        main_group_layout = QHBoxLayout()

        # loop on group names
        for group, buttons in groups.items():
            group_box = QGroupBox(group)
            group_layout = QVBoxLayout()
            for button_text in buttons:
                button = QRadioButton(button_text)
                button.setObjectName("radiobutton_%s" % button_text)

                button.toggled.connect(self.radio_func)

                group_layout.addWidget(button)

            group_box.setLayout(group_layout)
            main_group_layout.addWidget(group_box)

        main_group.setLayout(main_group_layout)

        # Widget
        main_widget = QWidget()
        main_widget_layout = QVBoxLayout()
        main_widget.setLayout(main_widget_layout)
        main_widget_layout.addWidget(main_group)
        # Layout Set
        self.setLayout(main_widget_layout)

        self.show()

    def radio_func(self):
        radio_btn = self.sender()
        print(f"{radio_btn.text()}\n-------------------")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    ui = ButtonWidget()
    sys.exit(app.exec_())

1 Ответ

2 голосов
/ 25 мая 2020

Переключаемый сигнал уведомляет об изменении состояния в QRadioButton, вначале все не отмечены, поэтому при нажатии одной кнопки один из них меняет статус с не отмеченного на отмеченный, при нажатии другой кнопки отмеченная кнопка меняется на unchecked, и нажатие изменяет состояние с не отмеченного на отмеченное, то есть есть 2 кнопки, которые изменяют состояние, поэтому будут выданы 2 сигнала.

Одно из возможных решений - использовать состояние, передаваемое сигналом:

def radio_func(self, <b>on</b>):
    if on:
        radio_btn = self.sender()
        print(f"{radio_btn.text()}\n-------------------")

Другое решение - использовать сигнал нажатия:

button.<b>clicked</b>.connect(self.radio_func)
...