为实现如下效果,搜索未得,自己总结。
1 效果

2 代码
以下非完整代码,仅作演示用。
2.1 引入包
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMainWindow, QApplication, QTreeWidgetItem
from PyQt5.uic import loadUi
import sys
2.2 树形控件的复选框选择和部分选择代码
以下代码经手动更换了部分变量名,所以可能有些变量名称前后不符。
# 此非完整代码
# 初始化树控件
self.treeWidget.setColumnCount(1) # 1列
self.treeWidget.expandAll()
mydict = {'张三': '学生', "李四": '学生', '王老师': "老师", '李老师': '老师'}
rolelist = set([v for k,v in mydict.items()]) # python 列表生成式用法
for role in rolelist:
# role node
rnode = QTreeWidgetItem(self.treeWidget)
rnode.setText(0, role)
rnode.setFlags(Qt.ItemFlag.ItemIsAutoTristate | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
rnode.setCheckState(0, Qt.PartiallyChecked) # 部分选择状态
self.treeWidget.addTopLevelItem(rnode)
# k 姓名, v 身份
for k,v in mydict.items():
if v == role:
child = QTreeWidgetItem(rnode)
child.setText(0, k)
child.setCheckState(0, Qt.CheckState.Unchecked)
重点是 14行和23行。
主要知识点:树节点的标志 Flag。
Qt.ItemFlag.ItemIsAutoTristate
自动根据子节点的选中状态显示自己的状态为 选中,半选中,未选中
Qt.ItemIsUserCheckable
用户可以点击
Qt.ItemIsEnabled
组件可用
根据官网说明:
Note that checkable items need to be given both a suitable set of flags and an initial state, indicating whether the item is checked or not. This is handled automatically for model/view components, but needs to be explicitly set for instances of QListWidgetItem, QTableWidgetItem, and QTreeWidgetItem.
翻译:
QTreeWidgetItem的 checkable item必须显式的设置item的flag标志和 check状态。
2.3 树形控件的简单遍历代码
roleNodeCnt = self.treeWidget.topLevelItemCount()
for i in range(0, roleNodeCnt):
roleNode = self.treeWidget.topLevelItem(i)
nameNodeCnt = roleNode.childCount()
for j in range(0, nameNodeCnt):
nameNode = roleNode.child(j)
print(nameNode.text(0)
输出:
王老师
李老师
张三
李四
2.4 树形控件的遍历checked元素的代码
在2.3的代码中加入元素是否被checked的判断代码。
# 需要导入Qt
from PyQt5.QtCore import Qt
roleNodeCnt = self.treeWidget.topLevelItemCount()
for i in range(0, roleNodeCnt):
roleNode = self.treeWidget.topLevelItem(i)
nameNodeCnt = roleNode.childCount()
for j in range(0, nameNodeCnt):
nameNode = roleNode.child(j)
if nameNode.checkState(0) == Qt.CheckState.Checked:
print(nameNode.text(0))
输出:
王老师
张三
李四
以上代码部分是在网页中手动敲入,可能有单词拼写错误,请自行更正后使用。
其他可自行查阅 Qt 官方文档。