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实现。

回到顶部