python - QCheckbox 检查所有其他 QCheckBoxes
问题描述
我的问题与这篇文章Python PyQt - Checkbox to uncheck all other checkboxes非常相似。However, I am trying to check all other boxes when main checkbox is selected and at the same time, if any of the other boxes are selected independently, then I would like to deselect the main checkbox. 我尝试修改提供的答案,但无法将头放在“self.sender”信号上。当我取消选择复选框时,我无法更改选择。这是我使用@eyllanesc提供的解决方案修改的代码。非常感谢任何帮助,谢谢!
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Test(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.checkBoxAll = QCheckBox("Select All")
self.checkBoxA = QCheckBox("Select A")
self.checkBoxB = QCheckBox("Select B")
self.checkBoxAll.setChecked(False)
self.checkBoxAll.stateChanged.connect(self.onStateChange)
self.checkBoxA.stateChanged.connect(self.onStateChange)
self.checkBoxB.stateChanged.connect(self.onStateChange)
grid = QGridLayout(self)
grid.addWidget(self.checkBoxAll, 1, 0)
grid.addWidget(self.checkBoxA, 2, 0)
grid.addWidget(self.checkBoxB, 3, 0)
self.setWindowTitle('Test')
self.show()
@pyqtSlot(int)
def onStateChange(self, state):
if state == Qt.Checked:
if self.sender() == self.checkBoxAll:
self.checkBoxA.setChecked(True)
self.checkBoxB.setChecked(True)
elif self.sender() in (self.checkBoxA, self.checkBoxB):
self.checkBoxAll.setChecked(False)
解决方案
使用您所拥有的逻辑,您正在创建一个循环,因为任何元素的状态更改以更改另一个元素的状态,其想法是在使用blockSignals()在插槽中实现状态更改时阻止信号的发射:
from PyQt5 import QtCore, QtGui, QtWidgets
class Test(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.checkBoxAll = QtWidgets.QCheckBox("Select All")
self.checkBoxAll.setChecked(False)
self.checkBoxAll.stateChanged.connect(self.onStateChangePrincipal)
self.checkBoxA = QtWidgets.QCheckBox("Select A")
self.checkBoxB = QtWidgets.QCheckBox("Select B")
self.checkboxes = [self.checkBoxA, self.checkBoxB]
for checkbox in self.checkboxes:
checkbox.stateChanged.connect(self.onStateChange)
grid = QtWidgets.QGridLayout(self)
grid.addWidget(self.checkBoxAll, 1, 0)
grid.addWidget(self.checkBoxA, 2, 0)
grid.addWidget(self.checkBoxB, 3, 0)
self.setWindowTitle('Test')
@QtCore.pyqtSlot(int)
def onStateChangePrincipal(self, state):
if state == QtCore.Qt.Checked:
for checkbox in self.checkboxes:
checkbox.blockSignals(True)
checkbox.setCheckState(state)
checkbox.blockSignals(False)
@QtCore.pyqtSlot(int)
def onStateChange(self, state):
self.checkBoxAll.blockSignals(True)
self.checkBoxAll.setChecked(QtCore.Qt.Unchecked)
self.checkBoxAll.blockSignals(False)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Test()
w.show()
sys.exit(app.exec_())
推荐阅读
- mysql - 'sql_require_primary_key' - 无法在不创建主键的情况下将我的数据帧发送到 mysql 服务器
- angular - 以角度将单个令牌解析为多个服务
- java - plugin.xml 导致 Intellij IDE 中的构建失败
- mysql - Mysql 最小求和。找出总分最低的学生姓名?
- javascript - 将 Firestore 时间戳发送到外部 API UTC 丢失
- python - 确定在 Python 多处理期间腌制的确切内容
- twitter-bootstrap - Bootstrap - 更改宽度不改变高度
- nsis - 如何从 Internet 下载文件并将其路径应用于 MUI_PAGE_LICENSE 宏?
- python - 通过对每个唯一用户进行分组并为每个唯一日期添加访问数列来对数据框进行排序和排名 Python
- python - 在 Django 中使用复选框下载文件?