снимите флажок с радиокнопки - PyQt4 - PullRequest
2 голосов
/ 31 декабря 2011

В этом примере кода:

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, что не должно происходить.

Что я должен сделать, чтобы иметь возможность разблокировать кнопки, когда можно выбрать только одну кнопку за раз?

1 Ответ

5 голосов
/ 31 декабря 2011

Это похоже на читерство, но оно работает:

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__.

...