python实现多层级复选框选中

python+pyqt5实现多层级复选框选中

  • 效果
    • 如何插入一段漂亮的代码片

效果

在这里插入图片描述

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
class filterWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        layout  = QVBoxLayout()
        self.setLayout(layout)
        self.tree = QTreeWidget()
        self.tree.setHeaderHidden(True)  # 隐藏表头
        self.tree.resize(300,600)
        self.tree.setColumnCount(2)
        self.tree.setColumnWidth(0,300)


        # root Node
        root = QTreeWidgetItem(self.tree)
        root.setText(0, "Root")
        root.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsSelectable )
        root.setCheckState(0, Qt.Checked)

        # add child to root
        child1 = QTreeWidgetItem(root)
        child1.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsSelectable )
        child1.setText(0, "Child 1")
        child1.setCheckState(0, Qt.Checked)

        # 添加子节点2
        child2 = QTreeWidgetItem(root)
        child2.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsSelectable )
        child2.setText(0, '子节点2')
        child2.setCheckState(0, Qt.Checked)

        # 为child2添加一个子节点
        child3 = QTreeWidgetItem(child2)
        child3.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsSelectable )
        child3.setText(0, '子节点3')
        child3.setCheckState(0, Qt.Checked)

        # 为child2添加一个子节点
        child4 = QTreeWidgetItem(child2)
        child4.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsSelectable)
        child4.setText(0, '子节点4')
        child4.setCheckState(0, Qt.Checked)

        # 默认所有节点都处于展开状态
        self.tree.expandAll()

        self.tree.itemChanged.connect(self.onTreeItemChanged)

        layout.addWidget(self.tree)
           def onTreeItemChanged(self, item, column):
        def get_Node_parent(item):
            if item.parent():
                return item.parent()
        def get_Node_child(item,childList):
            if item.childCount() == 0:
                childList.append(item)
            if item.childCount() > 0:
                for i in range(item.childCount()):
                    child_item = item.child(i)
                    childList.append(child_item)
                    get_Node_child(child_item,childList)
            return  childList

        def get_sample_level(item,is_sample = None):
            level = []
            sample_node = item.parent()
            if sample_node.childCount() == 1:
                level.append(item)
            elif sample_node.childCount() > 1:
                for i in range(sample_node.childCount()):
                    level.append(sample_node.child(i))
            if is_sample is None or is_sample is False:
                return level
            # 判断所有节点状态是否一致
            first_state = level[0].checkState(0)
            all_same_state = all(item.checkState(0) == first_state for item in level)
            if all_same_state:
                return  True
            else:
                return  False

        def get_All_Node(item):
            items = []
            for i in range(item.childCount()):
                child  = item.child(i)
                items.append(child)
                items.extend(get_All_Node(child))
            return items

        # 选中叶子节点
        if item.childCount() == 0:
            Node_parent = get_Node_parent(item)
            sample_level_code = get_sample_level(item, is_sample=True)
            if item.checkState(0) != Node_parent.checkState(0):
                # 检查其他节点的状态是否与第一个节点一致
                if sample_level_code:
                    Node_parent.setCheckState(0, item.checkState(0))
                else:
                    Node_parent.setCheckState(0, Qt.PartiallyChecked)
        # 选中根节点
        elif item.parent() is None:
            if item.checkState(0) == Qt.PartiallyChecked:
                return
            Node_All = get_All_Node(item)
            if item.checkState(0) == Qt.Checked:
                for i in Node_All:
                    if i.checkState(0) != Qt.Checked:
                        i.setCheckState(0, Qt.Checked)
            elif item.checkState(0) == Qt.Unchecked:
                for i in Node_All:
                    if i.checkState(0) != Qt.Unchecked:
                        i.setCheckState(0,  Qt.Unchecked)
        elif item.parent() is not None and item.childCount() > 0:
            Node_parent = get_Node_parent(item)
            sample_level_code = get_sample_level(item,is_sample = True)
            # 更新父节点的状态
            if sample_level_code:
                Node_parent.setCheckState(0, item.checkState(0))
            else:
                Node_parent.setCheckState(0, Qt.PartiallyChecked)
            if item.checkState(0) != Qt.PartiallyChecked:
                # 更新子节点的状态
                child_list = get_Node_child(item,[])
                for i in child_list:
                    i.setCheckState(0, item.checkState(0))

    def add_child_with_checkbox(self, parent, depth):
        if depth == 0:
            return
        for i in range(3):
            child = QTreeWidgetItem()
            child.setFlags(child.flags() | 0x20)  # 添加 ItemIsUserCheckable 标志
            child.setText(0, f"Child {i + 1}")
            parent.addChild(child)
            self.add_child_with_checkbox(child, depth - 1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/269796.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)

路径规划综述 1. 背景介绍 路径规划是指在给定的环境中找到从起点到终点的最佳路径的过程。它在现实生活中有着广泛的应用,包括无人驾驶、物流配送、机器人导航等领域。随着人工智能和计算机技术的发展,路径规划技术也在不断地得到改进和应用。 路径规划…

【hacker送书第11期】Python数据分析从入门到精通

探索数据世界,揭示未来趋势 《Python数据分析从入门到精通》是你掌握Python数据分析的理想选择。本书深入讲解核心工具如pandas、matplotlib和numpy,助您轻松处理和理解复杂数据。 通过matplotlib、seaborn和创新的pyecharts,本书呈现生动直…

web前端游戏项目-辨色大比拼【附源码】

web前端游戏项目-辨色大比拼【附源码】 《辨色大比拼》是一个旨在测试和提升玩家颜色识别能力的在线游戏。在游戏中,玩家将通过辨识颜色来解谜并推进游戏进程。辨色大比拼也是一个寓教于乐的游戏,它不仅提供了一个有趣的辨色挑战,还能帮助玩…

[C/C++]数据结构: 链式二叉树的构建及遍历

一: 💬二叉树的概念 1.1:🚩 概念 二叉树是指树中节点的度不大于2的有序树,它是一种最简单且重要的树,二叉树的递归定义为:二叉树是一颗空树,或者是一颗由一个根节点和两颗互不相交的,分别称为跟的左孩子和右孩子树组成的非空树,其中左子树和右子树都是二…

Linux部署MeterSphere结合内网穿透实现远程访问服务管理界面

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

【网络编程】基于UDP数据报实现回显服务器程序

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌 前言 我们如果…

Python基础入门第六节课笔记

while循环 for循环用于针对序列中的每个元素的一个代码块。 while循环是不断的运行,直到指定的条件不满足为止。 while 条件: 条件成立重复执行的代码1 条件成立重复执行的代码2 …….. 当条件成立时,执行下方缩…

【JavaEE初阶一】线程的概念与简单创建

1. 认识线程(Thread) 1.1 关于线程 1.1.1 线程是什么 由前一节的内容可知,进程在进行频繁的创建和销毁的时候,开销比较大(主要体现在资源的申请和释放上),线程就是为了解决上述产生的问题而提…

软件测试 —— 如何测试图片上传功能?

作为一名专业的软件测试人员,测试图片上传功能是一个重要的任务,以下是一些测试该功能的常用方法: 1. 上传功能测试:确保图片上传功能正常工作,包括选择图片文件、点击上传按钮、上传进度显示、上传成功/失败的提示等。…

postman的下载安装和使用

第一章、使用postman向后端发送请求 1.2)postman下载与安装使用 我的百度网盘postman点击下载 提取码:bybp 下载后双击.exe文件直接安装 点击此次创建集合 点击此处创建请求 1.2)发送get请求 选择自己的请求方式,输入请求…

1861_什么是H桥

Grey 全部学习内容汇总: GitHub - GreyZhang/g_hardware_basic: You should learn some hardware design knowledge in case hardware engineer would ask you to prove your software is right when their hardware design is wrong! 1861_什么是H桥 H桥电路可以…

Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库

问题:下图中是一个生成库的模块,其中qglobal.h的使用有点疑惑,可以参考下文链接。 ​​​​​​​​​​​​https://www.cnblogs.com/techiel/p/8035014.htmlhttps://www.cnblogs.com/techiel/p/8035014.html

Redis过期删除策略和内存淘汰策略

1、设置Redis键过期时间 Redis提供了四个命令来设置过期时间&#xff08;生存时间&#xff09;。 EXPIRE <key> <ttl> &#xff1a;表示将键 key 的生存时间设置为 ttl 秒。 PEXPIRE <key> <ttl> &#xff1a;表示将键 key 的生存时间设置为 ttl 毫秒。…

算法基础之最长上升子序列 II

最长上升子序列 II 核心思想&#xff1a;不去遍历全部的数据(会有冗余) 用vector模拟栈 ①如果该元素大于栈顶元素,将该元素入栈 ②替换掉第一个大于或者等于这个数字的那个数&#xff08;二分&#xff09; #include<iostream>#include<algorithm>#include&l…

Kafka日志文件存储

日志文件 kafka在server.properties配置文件中通过log.dir属性指定了Kafka的日志存储路径 核心文件 1. log文件 实际存储消息的日志文件, 大小固定1G(参数log.segment.bytes可配置), 写满后就会新增一个新的文件, 文件名是第一条消息的偏移量 2. index文件 以偏移量为索引…

4.9【共享源】流的多生产者和消费者

当一个系统中存在多个生产者和消费者时&#xff0c;情况可能会变得复杂。 了解生产者和消费者流之间支持的基数非常重要。 本质上&#xff0c;一个生产者流可以与多个消费者流连接&#xff0c;但一个消费者流只能连接到一个生产者流。请注意&#xff0c;基数关系仅限于单个流&…

3D渲染农场什么比较好用 2024渲染农场最新收费实测

随着数字设计领域的进步与发展&#xff0c;对于3D渲染服务的需求日益增加。3D渲染农场这一概念因此变得极为重要&#xff0c;特别是在电影制作、建筑可视化以及产品设计等行业中。现在&#xff0c;让我们深入了解3D渲染农场的定义以及市面上优秀的3D渲染服务提供商。 一、什么是…

Ai画板原理

在创建时画板可以选择数量和排列方式 也可以采用这个图片左上的画板工具&#xff0c;选择画板在其他地方画框即可生成&#xff0c;同时可以在属性框中可以修改尺寸大小 选择全部重新排列可以进行创建时的布局

STM32 支持IAP的bootloader开发,使用串口通过Ymodem协议传输固件

资料下载: https://download.csdn.net/download/vvoennvv/88658447 一、概述 关于IAP的原理和Ymodem协议&#xff0c;本文不做任何论述&#xff0c;本文只论述bootloader如何使用串口通过Ymodem协议接收升级程序并进行IAP升级&#xff0c;以及bootloader和主程序两个工程的配置…

yolo实现数据增强(数据集不够,快速增加数据集)

目录结构 附上数据增强的全部代码 # -*- codingutf-8 -*-import time import random import copy import cv2 import os import math import numpy as np from skimage.util import random_noise from lxml import etree, objectify import xml.etree.ElementTree as ET imp…