关于python:取消选中单选按钮-PyQt4

uncheck radiobutton - PyQt4

在此代码示例中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from PyQt4.QtGui import QDialog, QPushButton, QRadioButton, QHBoxLayout, QApplication, QButtonGroup
import sys

class Form(QDialog):
    def __init__(self, parent=None):
        super(Form, self).__init__(parent=None)

        button = QPushButton('Button')
        self.radiobutton1 = QRadioButton('1')
        self.radiobutton2 = QRadioButton('2')
        #self.group = QButtonGroup()
        #self.group.addButton(self.radiobutton1)
        #self.group.addButton(self.radiobutton2)      
        #self.group.setExclusive(False)

        layout = QHBoxLayout()
        layout.addWidget(button)
        layout.addWidget(self.radiobutton1)
        layout.addWidget(self.radiobutton2)
        self.setLayout(layout)

        button.clicked.connect(self.my_method)

    def my_method(self):
        self.radiobutton1.setChecked(False)
        self.radiobutton2.setChecked(False)

app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()

单击按钮时,我希望选中的radioButton未被选中,但这永远不会发生。如果取消注释注释行并运行代码,则可以取消选中radioButtons。但是出现另一个问题。因为该组不是唯一的,所以我可以将两个radioButtons都设置为选中的状态,这一定不能发生。

在一次只能选择一个按钮的情况下,如何解开按钮?


这感觉像是在作弊,但是有效:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import sys
import PyQt4.QtGui as QtGui

class Form(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Form, self).__init__(parent)

        button = QtGui.QPushButton('Button')
        button.clicked.connect(self.my_method)

        self.radiobutton1 = QtGui.QRadioButton('1')
        self.radiobutton2 = QtGui.QRadioButton('2')

        layout = QtGui.QHBoxLayout()
        layout.addWidget(button)
        layout.addWidget(self.radiobutton1)
        layout.addWidget(self.radiobutton2)
        self.setLayout(layout)

        self.group = QtGui.QButtonGroup()
        self.group.addButton(self.radiobutton1)
        self.group.addButton(self.radiobutton2)      

    def my_method(self):
        self.group.setExclusive(False)        
        self.radiobutton1.setChecked(False)
        self.radiobutton2.setChecked(False)
        self.group.setExclusive(True)

app = QtGui.QApplication(sys.argv)
form = Form()
form.show()
app.exec_()

您已经指出,设置self.group.setExclusive(False)时,可以取消切换两个单选按钮。

self.group.setExclusive(True)时,只能设置一个单选按钮。

因此my_method只需调用self.group.setExclusive(False),这样它就可以取消设置两个单选按钮,然后重置self.group.setExclusive(True)

PS。我认为parent不应在此行上设置为None

1
super(Form, self).__init__(parent = None)

因为如果将非平凡的parent发送给Form,则您可能希望将该parent传递给QDialog.__init__


对于寻求解决此非常烦人的问题的简单方法的任何人,请将每个按钮连接到控制其他按钮的CheckStateslot

只需将所需按钮的列表添加到QButtonGroup,获取按钮列表,检查sender是否不是同一按钮,然后取消选中其他按钮。

假设您在循环中实例化按钮,则可以轻松实现以下目的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
self.bg = QButtonGroup()
self.bg.setExclusive(False)

for button in list_of_buttons:
    self.bg.addButton(button)
    button.clicked.connect(self.uncheck_other_buttons)


def uncheck_other_btns(self):
    for button in self.bg.buttons():  # returns the list of all added buttons
        if self.sender() != button:   # in PyQt5, button.objectName() fails if name isn't set,
                                      # instead, simply check that the signal sender() object  
                                      # is not the same object as the clicked button
            button.setChecked(False)  # then set all other buttons to be unchecked