QTreeWidget实现复选框的全选/部分选择/半选择状态

 QTreeWidget实现复选框的全选/部分选择/半选择状态_第1张图片

 


import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QTreeWidget, QTreeWidgetItem, QLabel, QHBoxLayout


class Demo(QWidget):
     def __init__(self):
        super(Demo, self).__init__()
        self.resize(500, 300)
        self.label = QLabel('No Click')
        self.tree = QTreeWidget(self)  # 实例化树形控件
        self.tree.setColumnCount(1)  #将该树状控件的列数设为2(默认为1列)
        self.tree.setHeaderLabels(['树形控件', '列'])
        #设置每列的标题,如果只有一列的话,则应该通过setHeaderLabel(str)方法设置

        self.tree.itemClicked.connect(self.change_func)#单击控件时发出信号
        #这个信号会自动传递两个参数
        #参数1就是被单击的项目对象。
        #参数2就是单击的列序号

        self.preview = QTreeWidgetItem(self.tree)  # 实例化一个项目。参数:指定父类
        self.preview.setText(0, '顶层项目')  #给项目设置文本。参数1:列序号
        self.preview.setText(1, '顶层项目-1列')

        self.preview1 = QTreeWidgetItem()
        self.preview1.setText(0, '顶层项目1')
        self.preview1.setText(1, '顶层项目1-1列')
        self.tree.addTopLevelItem(self.preview1)  #把self.preview1项目设置为顶层项目

        self.qt5112 = QTreeWidgetItem()
        self.qt5112.setText(0, 'Qt 5112 snapshot')
        self.qt5112.setCheckState(0, Qt.Unchecked)  #设置复选框的位置和状态
        #参数1 复选框的位置 列序号
        #Qt.Unchecked   没选中
        #Qt.Checked    选中
        #Qt.PartiallyChecked   部分选中

        self.preview.addChild(self.qt5112)#给self.preview添加子项目self.qt5112
        #给self.qt5112添加父类

        choice_list = ['macOS', 'Android x86', 'Android ARMv7', 'Sources', 'iOS']
        self.item_list = []
        for i, c in enumerate(choice_list):
            item = QTreeWidgetItem(self.qt5112)
            item.setText(0, c)
            item.setCheckState(0, Qt.Unchecked)
            self.item_list.append(item)

        self.test_item = QTreeWidgetItem(self.qt5112)
        self.test_item.setText(0, 'test1')
        self.test_item.setText(1, 'test2')

        self.tree.expandAll()
        #让所有的项都是以打开状态显示的。注意必须要在所有项都已经实例化好之后再调用该方法,如果一开始就调用则会没有效果

        self.h_layout = QHBoxLayout()
        self.h_layout.addWidget(self.tree)
        self.h_layout.addWidget(self.label)
        self.setLayout(self.h_layout)

     def change_func(self, item, column):
        self.label.setText(item.text(column))
        #item.text(column)  返回项目指定列的文本

        if item == self.qt5112:
            if self.qt5112.checkState(0) == Qt.Checked:#判断self.qt5112复选框的状态。参数复选框位置:列序号
                #self.qt5112.checkState(0)   返回复选框的状态
                [x.setCheckState(0, Qt.Checked) for x in self.item_list]
            else:
                [x.setCheckState(0, Qt.Unchecked) for x in self.item_list]
        else:
            check_count = 0
            for x in self.item_list:
                if x.checkState(0) == Qt.Checked:
                    check_count += 1

            if check_count == 5:
                self.qt5112.setCheckState(0, Qt.Checked)
            elif 0 < check_count < 5:
                self.qt5112.setCheckState(0, Qt.PartiallyChecked)  #设置复选框为半选中状态
            else:
                self.qt5112.setCheckState(0, Qt.Unchecked)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

enjoy

你可能感兴趣的:(Qt,Python,PyQt(python,gui编程),ui)