0

我正在 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

我尝试使用

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

但这仅在切换组框本身时才有效。当其中一个单选按钮更改时,是否有任何方法可以从组合框中获取信号,或者我是否必须找到某种方法来处理来自单选按钮的单个信号?

4

1 回答 1

1

正如@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属性,除了单选按钮外,默认情况下它是关闭的。此属性使属于同一父窗口小部件的所有按钮自动独占。

如果您需要同一父级中的不同组,解决方案是使用 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

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

于 2019-11-09T19:45:59.813 回答