python - 如何让用户从未知数量的复选框 PyQt5 中只检查 2 个复选框?
问题描述
让复选框是随机的(5-10),我想限制用户选择任意两个复选框。self.check_boxes = [QtWidgets.QCheckBox(self.dockWidgetContents_2) for i in col_names]
这是我正在生成的复选框列表。请帮我制作我想要的复选框。这是我的代码:
def uncheck(self, state):
`if state == Qt.CheckState.Checked:
global checkedItems
try:
senderCheckBox = [i for i in self.check_boxes if i.isChecked() and not i in checkedItems][0]
checkedItems[0] = checkedItems[1]
checkedItems[1] = senderCheckBox
itemsToUncheck = [i for i in self.check_boxes if not i in checkedItems]
for checkBox in itemsToUncheck:
checkBox.setChecked(False)`
解决方案
为了保留选中的数字,您必须跟踪复选框的切换顺序。
要获得对已切换复选框的引用,您可以使用QButtonGroup,它具有一个buttonToggled
同时发出复选框和新状态的信号。
在连接到该信号的函数中,如果已选中状态,则将复选框附加到持久列表(不要使用全局变量!),并取消选中继续取消选中第一项,直到遵守数字;在同一功能中,如果未选中状态,则从该列表中删除复选框。这样,由于信号在同一个线程中是同步的,因此您可以使用一个简单的while
循环,并确保始终遵守顺序。
class Test(QtWidgets.QWidget):
def __init__(self):
super().__init__()
layout = QtWidgets.QVBoxLayout(self)
self.checked = []
self.buttonGroup = QtWidgets.QButtonGroup(exclusive=False)
for i in range(5):
checkBox = QtWidgets.QCheckBox('Check {}'.format(i + 1))
layout.addWidget(checkBox)
self.buttonGroup.addButton(checkBox)
self.buttonGroup.buttonToggled.connect(self.limitChecked)
def limitChecked(self, checkBox, state):
if state:
self.checked.append(checkBox)
# do *NOT* use a "for", as the list might change in the meantime
while len(self.checked) > 2:
self.checked[0].setChecked(False)
else:
if checkBox in self.checked:
self.checked.remove(checkBox)
推荐阅读
- ios - 无法在 tableView 中插入新行
- java - 在java中我们可以将main方法声明为:-final synchronized strictfp
- android - 删除 RecyclerView 中的填充
- javascript - 在 javascript 上的 for 和 while
- c# - C#将多个excel的所有数据复制到一个工作表中
- javascript - 如何在 WordPress `functions.php` 中将一个又一个脚本排入队列,并让它们一起工作?
- bash - 为什么在 .profile 脚本中转义 eval 的第一个字符?
- java - java.sql.TimeStamp 没有默认构造函数
- bash - 读取自制软件包管理器的“手册页”时出错
- java - 在 @Query 中使用 #{principal} 会导致“在 null 上找不到属性或字段‘principal’”