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 根据“主”状态添加它们。
注意:
- 当创建多个对象时,将它们设置为实例成员是没有用的:实例属性的目的是对对象进行持久引用,如果你不断地覆盖该引用,你将失去这个好处;
- 大多数信号都提供了参数,尤其是那些与“变化”相关的信号;调用
isChecked()
是不必要的,因为 stateChanged
已经 returns 当前状态,您只需要将参数添加到函数;
- 除非你需要一个三态复选框,正确的信号是
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)
但是请小心使用上面的方法,因为默认情况下它会递归地查看整个对象树,因此使用列表仍然是更好的解决方案。
我有两个 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 根据“主”状态添加它们。
注意:
- 当创建多个对象时,将它们设置为实例成员是没有用的:实例属性的目的是对对象进行持久引用,如果你不断地覆盖该引用,你将失去这个好处;
- 大多数信号都提供了参数,尤其是那些与“变化”相关的信号;调用
isChecked()
是不必要的,因为stateChanged
已经 returns 当前状态,您只需要将参数添加到函数; - 除非你需要一个三态复选框,正确的信号是
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)
但是请小心使用上面的方法,因为默认情况下它会递归地查看整个对象树,因此使用列表仍然是更好的解决方案。