2011-12-31 180 views
2

在此示例代码:取消选中单选按钮 - 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_() 

当按钮点击我希望所选择的单选按钮被选中,但从未发生过。如果我取消注释注释行并运行代码,那么我可以取消选中radioButtons。但是另一个问题发生。因为该组不是唯一的,我可以设置两个radioButtons检查一些不会发生的事情。

我该怎么做才能够取消按钮,同时只能选择一个按钮?

回答

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)设置,您可以untoggle两个单选按钮。

而当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,你可能会想传递parentQDialog.__init__