【PyQt】树形控件QTreeWidget的复选框实现自动部分选择/半选择状态

18 篇文章 1 订阅
16 篇文章 3 订阅

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

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 官方文档。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qilei2010

送我一张彩票中了平分

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值