QCheckBox 到 check/uncheck 来自 PyQt5 中另一个 class 的所有 QCheckboxes

QCheckBox to check/uncheck all QCheckboxes from another class in PyQt5

我有两个 QWidget classes:Widget1 和 Widget2,我想在第一个 class (Widget1) 中有一个 QCheckBox 可以 check/uncheck 所有 QcheckBoxes 生成由第二个 class (Widget2)。有没有办法做到这一点? 非常感谢您的帮助。

class Widget1(QWidget):
    def __init__(self, ids):
        super().__init__()
        self.ids = ids  # ids is a list of list [[1, 1], [2, 2], [3, 3], ..., [n, n] generated elsewhere in the code 
        self.initUI()

    def initUI(self):
        self.widget1_layout = QVBoxLayout()
        self.setLayout(self.Widget1_Layout)

        self.master_checkbox = QCheckBox("Select all")
        self.master_checkbox.stateChanged.connect(self.selectAll)
        self.widget1_layout.addWidget(self.master_checkbox)

        for i, id in enumerate(self.ids):
            self.singleID_checkbox = Widget2(self, i, id)
            self.widget1_layout.addWidget(self.singleID_checkbox)

     def selectAll(self):
        if self.master_checkbox.isChecked():
            function_that_check_all_Widget2_checkboxes()
        else:
            function_that_UNcheck_all_Widget2_checkboxes()



class Widget2(QWidget):
    def __init__(self, parent, i, id, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.i = i
        self.id = id
        self.initUI()
    
    def initUI(self):
        self.singleIDcheckbox_layout = QGridLayout(self)
        self.singleIDcheckbox = QCheckBox(str(self.id))
        self.singleIDcheckbox_layout.addWidget(self.singleIDcheckbox, self.i, 0)

两个函数

function_that_check_all_Widget2_checkboxes()

function_that_UNcheck_all_Widget2_checkboxes()

不存在。

它们在这里作为示例以更好地展示我的问题,因为我想这是我应该放一些代码来完成我想要实现的目标的地方。

最简单的解决方案是在创建它们时将每个小部件添加到列表中,然后 check/uncheck 根据“主”状态添加它们。

注意:

  1. 当创建多个对象时,将它们设置为实例成员是没有用的:实例属性的目的是对对象进行持久引用,如果你不断地覆盖该引用,你将失去这个好处;
  2. 大多数信号都提供了参数,尤其是那些与“变化”相关的信号;调用 isChecked() 是不必要的,因为 stateChanged 已经 returns 当前状态,您只需要将参数添加到函数;
  3. 除非你需要一个三态复选框,正确的信号是toggled(returns一个bool状态),而不是stateChanged(其中 returns 一个 Qt.CheckState 标志,其中有 2 个用于检查状态);
class Widget1(QWidget):
    # ...
    def initUI(self):
        self.widget1_layout = QVBoxLayout(self)

        self.master_checkbox = QCheckBox("Select all")
        self.master_checkbox.toggled.connect(self.selectAll)
        self.widget1_layout.addWidget(self.master_checkbox)

        self.checkboxes = []
        for i, id in enumerate(self.ids):
            singleID_checkbox = Widget2(self, i, id)
            self.widget1_layout.addWidget(singleID_checkbox)
            self.checkboxes.append(singleID_checkbox)

    def selectAll(self, state):
        for check in self.checkboxes:
            check.setChecked(state)


class Widget2(QWidget):
    # ...
    def setChecked(self, state):
        self.singleIDcheckbox.setChecked(state)

请注意,由于您正在使用专门的 class,因此您 可以 也可以使用 findChildren,其中 returns 所有子对象是指定 class:

的实例
    def selectAll(self, state):
        for check in self.findChildren(Widget2):
            check.setChecked(state)

但是请小心使用上面的方法,因为默认情况下它会递归地查看整个对象树,因此使用列表仍然是更好的解决方案。