取消选中单选按钮 - PyQt4
Posted
技术标签:
【中文标题】取消选中单选按钮 - PyQt4【英文标题】:uncheck radiobutton - PyQt4 【发布时间】:2012-01-31 04:09:04 【问题描述】:在此代码示例中:
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 检查一些不能发生的事情。
我应该怎么做才能在一次只能选择一个按钮的情况下取消选中按钮?
【问题讨论】:
【参考方案1】:对于寻求简单解决这个非常烦人的问题的任何人,请将每个按钮连接到控制其他按钮的 CheckState
的 slot
。
只需将您想要的按钮列表添加到QButtonGroup
,获取按钮列表,检查sender
是否不是同一个按钮,然后取消选中其他按钮。
假设你在一个循环中实例化你的按钮,你可以很容易地实现这个:
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
【讨论】:
【参考方案2】:这感觉像是作弊,但确实有效:
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__
。
【讨论】:
QButtonGroup 在 PyQt5 中的 QtWidgets(不是 QtGui)中以上是关于取消选中单选按钮 - PyQt4的主要内容,如果未能解决你的问题,请参考以下文章