首页 > 解决方案 > 如何让用户从未知数量的复选框 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)`

标签: pythoncheckboxpyqt5

解决方案


为了保留选中的数字,您必须跟踪复选框的切换顺序。

要获得对已切换复选框的引用,您可以使用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)

推荐阅读