当 QGroupbox 中的单选按钮之一更改时,我可以从 QGroupbox 获取信号吗?

Lil*_*rog 1 python pyqt qgroupbox pyqt5

我正在 PYQT 5 中制作一个用户界面。它包括一个包含几个 QRadioButton 的 QGroupBox。当发生切换事件时,我检查按钮并执行一些操作。问题是有两个切换事件,因为一个按钮打开,一个按钮关闭,所以我的代码总是运行两次。

我一直在寻找来自 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
Run Code Online (Sandbox Code Playgroud)

我尝试使用

self.groupBox.toggled.connect(self.update_stimulus)
Run Code Online (Sandbox Code Playgroud)

但这仅在组框本身被切换时才有效。当其中一个单选按钮发生变化时,有什么方法可以从组框中获取信号,或者我是否必须找到某种方法来处理来自单选按钮的单独信号?

mus*_*nte 5

正如@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')
Run Code Online (Sandbox Code Playgroud)

但请记住,如果您想在同一个组框中有不同的单选按钮“组”,则这些都无法正常工作,因为它们都将被视为同一个组的一部分:所有 Qt 按钮(继承的小部件)QAbstractButton:QPushButton、QToolButton、QCheckBox 和 QRadioButton)有一个默认情况下处于关闭状态的autoExclusive属性(单选按钮除外)。此属性使属于同一父窗口小部件的所有按钮自动互斥。

如果您需要同一父级中的不同组,解决方案是使用 a 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
Run Code Online (Sandbox Code Playgroud)

也可以从设计器中创建按钮组:只需选择至少两个将成为同一组成员的按钮,右键单击其中一个,转到“分配到按钮组”子菜单并选择“新建按钮组” ”。要将按钮添加到现有组,只需使用相同的上下文菜单并选择要添加该按钮的组。