2011-12-31 244 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__