在 pyqt5 中切换 QRadioButton:单击选中的单选按钮时取消选中
Toggling a QRadioButton in pyqt5: uncheck when a checked radio button is clicked
我在 pyQt5 的 QButtonGroup 中使用了一些 QRadioButtons。我希望用户能够 select 独占选项之一或 none,所以如果他不小心点击了一个单选按钮,他应该能够再次点击它以取消选中它。
我目前的方法是将点击方法连接到检查按钮状态的自定义函数,但我不知道如何在不使用可疑点击计数器的情况下以简单的方式做到这一点。
from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QHBoxLayout, QButtonGroup
import sys
class MainWindow(QWidget):
def __init__(self):
super().__init__()
# Radio buttons
self.group = QButtonGroup()
self.b1 = QRadioButton()
self.group.addButton(self.b1)
self.b1.clicked.connect(lambda: self.radioButtonClicked())
self.b2 = QRadioButton()
self.group.addButton(self.b2)
self.b2.clicked.connect(lambda: self.radioButtonClicked())
# Layout
self.layout = QHBoxLayout()
self.layout.addWidget(self.b1)
self.layout.addWidget(self.b2)
self.setLayout(self.layout)
def radioButtonClicked(self):
if self.sender().isChecked():
self.sender().setAutoExclusive(False)
self.sender().setChecked(False) # This is not working, as it fires on the first click
self.sender().setAutoExclusive(True)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
试一试:
from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QHBoxLayout, QButtonGroup
import sys
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self._dictRB = { # +++
'rb1': False,
'rb2': False,
'rb3': False,
}
# Radio buttons
self.group = QButtonGroup()
self.b1 = QRadioButton('rb1') # + 'rb1'
self.group.addButton(self.b1)
# self.b1.clicked.connect(lambda: self.radioButtonClicked())
self.b2 = QRadioButton('rb2') # + 'rb2'
self.group.addButton(self.b2)
# self.b2.clicked.connect(lambda: self.radioButtonClicked())
self.b3 = QRadioButton('rb3') # +++
self.group.addButton(self.b3)
# Layout
self.layout = QHBoxLayout()
self.layout.addWidget(self.b1)
self.layout.addWidget(self.b2)
self.setLayout(self.layout)
self.group.buttonClicked.connect(self.check_button) # +++
def check_button(self, radioButton): # +++
if self._dictRB[radioButton.text()]:
self._dictRB[radioButton.text()] = False
self._dictRB['rb3'] = True
self.b3.setChecked(True)
else:
for b in self._dictRB:
self._dictRB[b] = False
self._dictRB[radioButton.text()] = True
print("clickеd button -> `{} - {}`".format(radioButton.text(), radioButton.isChecked()))
'''
def radioButtonClicked(self):
if self.sender().isChecked():
self.sender().setAutoExclusive(False)
self.sender().setChecked(False) # This is not working, as it fires on the first click
self.sender().setAutoExclusive(True)
'''
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
最后,我分两步得出了解决方案:首先,让按钮组不排他,这样当再次点击按钮时可以取消选中。其次,选择收音机后,取消选中所有其他按钮。
from PyQt5.QtWidgets import (QApplication, QWidget, QRadioButton,QHBoxLayout, QButtonGroup)
import sys
class MainWindow(QWidget):
def __init__(self):
super().__init__()
# Radio buttons
self.group = QButtonGroup()
self.group.setExclusive(False) # Radio buttons are not exclusive
self.group.buttonClicked.connect(self.check_buttons)
self.b1 = QRadioButton()
self.group.addButton(self.b1)
self.b2 = QRadioButton()
self.group.addButton(self.b2)
# Layout
self.layout = QHBoxLayout()
self.layout.addWidget(self.b1)
self.layout.addWidget(self.b2)
self.setLayout(self.layout)
def check_buttons(self, radioButton):
# Uncheck every other button in this group
for button in self.group.buttons():
if button is not radioButton:
button.setChecked(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
def delectRadioButtons(self):
if self.radioButton_female.isCheckable() or self.radioButton_male.isCheckable():
self.radioButton_male.setChecked(True)
self.radioButton_female.setChecked(True)
self.radioButton_male.setCheckable(False)
self.radioButton_female.setCheckable(False)
self.radioButton_female.setCheckable(True)
self.radioButton_male.setCheckable(True)
我在 pyQt5 的 QButtonGroup 中使用了一些 QRadioButtons。我希望用户能够 select 独占选项之一或 none,所以如果他不小心点击了一个单选按钮,他应该能够再次点击它以取消选中它。
我目前的方法是将点击方法连接到检查按钮状态的自定义函数,但我不知道如何在不使用可疑点击计数器的情况下以简单的方式做到这一点。
from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QHBoxLayout, QButtonGroup
import sys
class MainWindow(QWidget):
def __init__(self):
super().__init__()
# Radio buttons
self.group = QButtonGroup()
self.b1 = QRadioButton()
self.group.addButton(self.b1)
self.b1.clicked.connect(lambda: self.radioButtonClicked())
self.b2 = QRadioButton()
self.group.addButton(self.b2)
self.b2.clicked.connect(lambda: self.radioButtonClicked())
# Layout
self.layout = QHBoxLayout()
self.layout.addWidget(self.b1)
self.layout.addWidget(self.b2)
self.setLayout(self.layout)
def radioButtonClicked(self):
if self.sender().isChecked():
self.sender().setAutoExclusive(False)
self.sender().setChecked(False) # This is not working, as it fires on the first click
self.sender().setAutoExclusive(True)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
试一试:
from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QHBoxLayout, QButtonGroup
import sys
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self._dictRB = { # +++
'rb1': False,
'rb2': False,
'rb3': False,
}
# Radio buttons
self.group = QButtonGroup()
self.b1 = QRadioButton('rb1') # + 'rb1'
self.group.addButton(self.b1)
# self.b1.clicked.connect(lambda: self.radioButtonClicked())
self.b2 = QRadioButton('rb2') # + 'rb2'
self.group.addButton(self.b2)
# self.b2.clicked.connect(lambda: self.radioButtonClicked())
self.b3 = QRadioButton('rb3') # +++
self.group.addButton(self.b3)
# Layout
self.layout = QHBoxLayout()
self.layout.addWidget(self.b1)
self.layout.addWidget(self.b2)
self.setLayout(self.layout)
self.group.buttonClicked.connect(self.check_button) # +++
def check_button(self, radioButton): # +++
if self._dictRB[radioButton.text()]:
self._dictRB[radioButton.text()] = False
self._dictRB['rb3'] = True
self.b3.setChecked(True)
else:
for b in self._dictRB:
self._dictRB[b] = False
self._dictRB[radioButton.text()] = True
print("clickеd button -> `{} - {}`".format(radioButton.text(), radioButton.isChecked()))
'''
def radioButtonClicked(self):
if self.sender().isChecked():
self.sender().setAutoExclusive(False)
self.sender().setChecked(False) # This is not working, as it fires on the first click
self.sender().setAutoExclusive(True)
'''
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
最后,我分两步得出了解决方案:首先,让按钮组不排他,这样当再次点击按钮时可以取消选中。其次,选择收音机后,取消选中所有其他按钮。
from PyQt5.QtWidgets import (QApplication, QWidget, QRadioButton,QHBoxLayout, QButtonGroup)
import sys
class MainWindow(QWidget):
def __init__(self):
super().__init__()
# Radio buttons
self.group = QButtonGroup()
self.group.setExclusive(False) # Radio buttons are not exclusive
self.group.buttonClicked.connect(self.check_buttons)
self.b1 = QRadioButton()
self.group.addButton(self.b1)
self.b2 = QRadioButton()
self.group.addButton(self.b2)
# Layout
self.layout = QHBoxLayout()
self.layout.addWidget(self.b1)
self.layout.addWidget(self.b2)
self.setLayout(self.layout)
def check_buttons(self, radioButton):
# Uncheck every other button in this group
for button in self.group.buttons():
if button is not radioButton:
button.setChecked(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
def delectRadioButtons(self):
if self.radioButton_female.isCheckable() or self.radioButton_male.isCheckable():
self.radioButton_male.setChecked(True)
self.radioButton_female.setChecked(True)
self.radioButton_male.setCheckable(False)
self.radioButton_female.setCheckable(False)
self.radioButton_female.setCheckable(True)
self.radioButton_male.setCheckable(True)