Python中Qt Designer如何为Tree Widget的每个item添加CheckBox复选框?
如图,Tree Widget 带有层次效果,所以用了,但是属性里好像没有类似于 CheckBox 效果的选项,有个 Checkable 但是不是复选框 CheckBox 的效果。。
https://img.alicdn.com/imgextra/i1/3024818780/TB2yMMdgIPRfKJjSZFOXXbKEVXa_!!3024818780.png
Python中Qt Designer如何为Tree Widget的每个item添加CheckBox复选框?
1 回复
在Qt Designer里没法直接给QTreeWidgetItem加CheckBox,得在代码里实现。下面是完整示例:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
class TreeWidgetWithCheckBox(QTreeWidget):
def __init__(self):
super().__init__()
self.setHeaderLabels(['Items'])
# 添加带CheckBox的item
root_item = QTreeWidgetItem(self, ['Root'])
root_item.setCheckState(0, Qt.Unchecked)
child1 = QTreeWidgetItem(root_item, ['Child 1'])
child1.setCheckState(0, Qt.Unchecked)
child2 = QTreeWidgetItem(root_item, ['Child 2'])
child2.setCheckState(0, Qt.Unchecked)
# 展开所有项
self.expandAll()
# 连接信号
self.itemChanged.connect(self.on_item_changed)
def on_item_changed(self, item, column):
"""处理CheckBox状态变化"""
if column == 0:
state = item.checkState(column)
# 递归设置子项状态
self.set_children_state(item, state)
# 更新父项状态
self.update_parent_state(item)
def set_children_state(self, parent, state):
"""递归设置所有子项状态"""
for i in range(parent.childCount()):
child = parent.child(i)
child.setCheckState(0, state)
self.set_children_state(child, state)
def update_parent_state(self, item):
"""更新父项状态(部分选中/全选/未选)"""
parent = item.parent()
if parent:
checked_count = 0
unchecked_count = 0
for i in range(parent.childCount()):
child = parent.child(i)
if child.checkState(0) == Qt.Checked:
checked_count += 1
elif child.checkState(0) == Qt.Unchecked:
unchecked_count += 1
if checked_count == parent.childCount():
parent.setCheckState(0, Qt.Checked)
elif unchecked_count == parent.childCount():
parent.setCheckState(0, Qt.Unchecked)
else:
parent.setCheckState(0, Qt.PartiallyChecked)
# 递归向上更新
self.update_parent_state(parent)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QMainWindow()
tree = TreeWidgetWithCheckBox()
window.setCentralWidget(tree)
window.resize(400, 300)
window.show()
sys.exit(app.exec_())
关键就两点:1)用setCheckState()给item加CheckBox;2)用itemChanged信号处理状态同步。父子项状态同步的逻辑需要自己写,Qt没提供自动同步。
总结:在代码里用setCheckState实现。

