取消选中单选按钮 - PyQt4

时间:2011-12-31 18:43:41

标签: python radio-button pyqt4

在此代码示例中:

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。

如果只能选择一个按钮,我该怎样做才能解开按钮?

2 个答案:

答案 0 :(得分:5)

这就像作弊一样,但它有效:

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

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

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

答案 1 :(得分:1)

对于寻求解决此烦人问题的简单方法的任何人,请将每个按钮连接到控制其他按钮的slot的{​​{1}}。

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

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

sender