1 import sys 2 from PyQt5.QtCore import Qt 3 from PyQt5.QtWidgets import QApplication, QWidget, QTreeWidget, QTreeWidgetItem, QLabel, QHBoxLayout 4 5 6 class Demo(QWidget): 7 def __init__(self): 8 super(Demo, self).__init__() 9 self.resize(500, 300) 10 self.label = QLabel('No Click') 11 12 self.tree = QTreeWidget(self) # 实例化树形控件 13 self.tree.setColumnCount(1) #将该树状控件的列数设为2(默认为1列) 14 self.tree.setHeaderLabels(['树形控件', '列']) 15 #设置每列的标题,如果只有一列的话,则应该通过setHeaderLabel(str)方法设置 16 17 self.tree.itemClicked.connect(self.change_func)#单击控件时发出信号 18 #这个信号会自动传递两个参数 19 #参数1就是被单击的项目对象。<PyQt5.QtWidgets.QTreeWidgetItem object at 0x0000008269BE7EE8> 20 #参数2就是单击的列序号 21 22 self.preview = QTreeWidgetItem(self.tree) # 实例化一个项目。参数:指定父类 23 self.preview.setText(0, '顶层项目') #给项目设置文本。参数1:列序号 24 self.preview.setText(1, '顶层项目-1列') 25 26 self.preview1 = QTreeWidgetItem() 27 self.preview1.setText(0, '顶层项目1') 28 self.preview1.setText(1, '顶层项目1-1列') 29 self.tree.addTopLevelItem(self.preview1) #把self.preview1项目设置为顶层项目 30 31 self.qt5112 = QTreeWidgetItem() 32 self.qt5112.setText(0, 'Qt 5112 snapshot') 33 self.qt5112.setCheckState(0, Qt.Unchecked) #设置复选框的位置和状态 34 #参数1 复选框的位置 列序号 35 #Qt.Unchecked 没选中 36 #Qt.Checked 选中 37 #Qt.PartiallyChecked 部分选中 38 39 self.preview.addChild(self.qt5112)#给self.preview添加子项目self.qt5112 40 #给self.qt5112添加父类 41 42 choice_list = ['macOS', 'Android x86', 'Android ARMv7', 'Sources', 'iOS'] 43 self.item_list = [] 44 for i, c in enumerate(choice_list): 45 item = QTreeWidgetItem(self.qt5112) 46 item.setText(0, c) 47 item.setCheckState(0, Qt.Unchecked) 48 self.item_list.append(item) 49 50 self.test_item = QTreeWidgetItem(self.qt5112) 51 self.test_item.setText(0, 'test1') 52 self.test_item.setText(1, 'test2') 53 54 self.tree.expandAll() 55 #让所有的项都是以打开状态显示的。注意必须要在所有项都已经实例化好之后再调用该方法,如果一开始就调用则会没有效果 56 57 self.h_layout = QHBoxLayout() 58 self.h_layout.addWidget(self.tree) 59 self.h_layout.addWidget(self.label) 60 self.setLayout(self.h_layout) 61 62 def change_func(self, item, column): 63 self.label.setText(item.text(column)) 64 #item.text(column) 返回项目指定列的文本 65 66 if item == self.qt5112: 67 if self.qt5112.checkState(0) == Qt.Checked:#判断self.qt5112复选框的状态。参数复选框位置:列序号 68 #self.qt5112.checkState(0) 返回复选框的状态 69 [x.setCheckState(0, Qt.Checked) for x in self.item_list] 70 else: 71 [x.setCheckState(0, Qt.Unchecked) for x in self.item_list] 72 else: 73 check_count = 0 74 for x in self.item_list: 75 if x.checkState(0) == Qt.Checked: 76 check_count += 1 77 78 if check_count == 5: 79 self.qt5112.setCheckState(0, Qt.Checked) 80 elif 0 < check_count < 5: 81 self.qt5112.setCheckState(0, Qt.PartiallyChecked) #设置复选框为半选中状态 82 else: 83 self.qt5112.setCheckState(0, Qt.Unchecked) 84 85 86 if __name__ == '__main__': 87 app = QApplication(sys.argv) 88 demo = Demo() 89 demo.show() 90 sys.exit(app.exec_())