RadioBox信号混乱

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RadioBox信号混乱相关的知识,希望对你有一定的参考价值。

我试图创建多 QRadioButton 在不同 QGroupBox. 之后,我想... print() 其中 QRadioButton 在屏幕上按下。

当我按下屏幕上的第一个按钮 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_())
答案

拨动信号通知QRadioButton的状态变化,一开始所有的按钮都是未选中的,所以当按下一个按钮时,其中一个按钮的状态由未选中变为选中,当你按下另一个按钮时,那么选中的按钮变为未选中,而按下的由未选中变为选中,也就是说,有2个按钮的状态发生了变化,所以会发出2个信号。

一种可能的解决方案是使用信号传输的状态。

def radio_func(self, on):
    if on:
        radio_btn = self.sender()
        print(f"radio_btn.text()\n-------------------")

另一个解决方案是使用点击的信号。

button.clicked.connect(self.radio_func)

以上是关于RadioBox信号混乱的主要内容,如果未能解决你的问题,请参考以下文章

锁机制,信号机制及事件机制

QTableView点击信号从未发出?

16.信号量互斥编程

Android C++系列:Linux信号

锁机制---信号机制----事件机制

进程之机制问题(锁,信号,事件)