【Python】QTreeWidget树形结构添加

news2024/11/18 18:24:27

源码:

# 参考网址: https://blog.csdn.net/weixin_42286052/article/details/129532631
import os.path
import sys
from PySide6.QtWidgets import QApplication,QMainWindow,QHBoxLayout,QVBoxLayout,QPushButton,QTreeWidget,QTreeWidgetItem,QTreeWidgetItemIterator
from PySide6.QtGui import QStandardItemModel,QStandardItem
from QTreeWidgetUi import Ui_MainWindow
from PySide6.QtCore import Qt,QAbstractItemModel
import configparser

class ParseNone():
    def __init__(self,fileName):
        self.config_path = os.path.join(os.path.dirname(__file__), fileName)
        self.config_ini = configparser.ConfigParser()
        self.config_ini.read(self.config_path,encoding="utf-8")


# parser = ParseNone("config.ini")



class TreeWidgetDemo(QMainWindow,Ui_MainWindow):
    def __init__(self, parent=None):
        super(TreeWidgetDemo, self).__init__(parent)
        self.setWindowTitle('TreeWidget 例子')
        self.setupUi(self)
        self.Listener()

        self.config = ParseNone("config.ini")

        self.tree = self.treeWidget
        self.tree.setHeaderLabels(['中国省份城市'])
        # 设置列数
        self.tree.setColumnCount(1)
        self.tree.setColumnWidth(0, 100)

        self.preview = QTreeWidgetItem(self.tree)  # 实例化一个项目。参数:指定父类
        self.preview.setText(0, '中国')
        self.preview.setCheckState(0, Qt.Unchecked)

        for root in self.config.config_ini.sections():
            items = self.config.config_ini.items(root)
            parent = QTreeWidgetItem(self.preview)
            parent.setText(0, root)
            parent.setCheckState(0, Qt.CheckState.Unchecked)
            for item in items:
                node = QTreeWidgetItem(parent)
                node.setText(0,item[1])
                node.setCheckState(0,Qt.Unchecked)
        # 参数1 复选框的位置 列序号
        # Qt.Unchecked   没选中
        # Qt.Checked    选中
        # Qt.PartiallyChecked   部分选中

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

        self.tree.itemClicked.connect(self.handleChanged)

    # def handleChanged(self, item, column):
    #     count = item.childCount()
    #     if item.checkState(column) == Qt.CheckState.Checked:
    #         for i in range(count):
    #             if item.child(i).checkState(0) != Qt.CheckState.Checked:
    #                 item.child(i).setCheckState(0,Qt.CheckState.Checked)
    #
    #     if item.checkState(column) == Qt.CheckState.Unchecked:
    #         for i in range(count):
    #             if item.child(i).checkState(0) != Qt.CheckState.Unchecked:
    #                 item.child(i).setCheckState(0,Qt.CheckState.Unchecked)

    def updateParentItems(self,item,column):
        parent = item.parent()
        if parent == None: return
        parent.setCheckState(column, item.checkState(column))
        count = parent.childCount()
        for i in range(count):
            child = parent.child(i)
            if child.checkState(column) != parent.checkState(column):
                parent.setCheckState(column, Qt.CheckState.PartiallyChecked)
                break

        self.updateParentItems(parent, column)

    def updateChildItems(self, item, column):
        count = item.childCount()
        for i in range(count):
            child = item.child(i)
            child.setCheckState(column,item.checkState(column))
            if child.childCount() > 0:
                self.updateChildItems(child, column)

    def handleChanged(self, item, column):
        # 注意,一定要先设置子节点,在设置父节点,不然现象比较奇怪
        self.updateChildItems(item, column)
        self.updateParentItems(item, column)
        self.GetSelectedNode(item, column)

    def GetSelectedNode(self,item, column):
        iterator = QTreeWidgetItemIterator(item)
        while iterator.value():
            item = iterator.value()
            # print(item.parent())
            if item.checkState(column) == Qt.CheckState.Checked:
                print(item.text(column))
                pass
            iterator +=1

    def traverse(self):
        """遍历节点"""
        n = self.treeWidget.topLevelItemCount()  # 获取根节点数量
        for i in range(0, n):
            item = self.treeWidget.topLevelItem(i)  # 循环获取根节点
            text = item.text(0)  # 根节点文字信息(默认一列)

            count = item.childCount()  # 获取当前根节点的子节点数量
            if count != 0:
                for j in range(0, count):
                    string = item.child(j).text(0)  # 子节点的文字信息
                    print(string)

    def Listener(self):
        # 按钮的信号槽连接
        self.pushButton_add.clicked.connect(self.addTreeNodeBtn)
        self.pushButton_del.clicked.connect(self.delTreeNodeBtn)
        self.pushButton_modify.clicked.connect(self.updateTreeNodeBtn)


    def onTreeClicked(self, qmodelindex):
        item = self.tree.currentItem()
        print("key=%s ,value=%s" % (item.text(0), item.text(1)))

    def addTreeNodeBtn(self):
        item = self.tree.currentItem()
        print(item.parent(), item.childCount())
        node = QTreeWidgetItem(item)
        node.setText(0, 'newNode')
        node.setText(1, '10')

    def updateTreeNodeBtn(self):
        print('--- updateTreeNodeBtn ---')
        item = self.tree.currentItem()
        item.setText(0, 'updateNode')
        item.setText(1, '20')

    def delTreeNodeBtn(self):
        print('--- delTreeNodeBtn ---')
        item = self.tree.currentItem()
        root = self.tree.invisibleRootItem()
        for item in self.tree.selectedItems():
            (item.parent() or root).removeChild(item)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    tree = TreeWidgetDemo()
    tree.show()
    sys.exit(app.exec())

[中国]
node1 = 北京
node2 = 上海
node3 = 重庆
node4 = 天津
node5 = 广东

[广东]
node1 = 广州
node2 = 深圳
node3 = 东莞

[贵州]
node1 = 贵阳
node2 = 遵义
node3 = 安顺

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抖音自动养号脚本+抖音直播控场脚本

功能描述 一.抖音功能 1.垂直浏览 2.直播暖场 3.精准引流 4.粉丝留言 5.同城引流 6.取消关注 7.万能引流 8.精准截流 9.访客引流 10.直播间引流 11.视频分享 12.榜单引流 13.搜索引流 14.点赞回访 15.智能引流 16.关注回访 介绍下小红书数据挖掘 搜索关键词&…

uml简单用例图怎么画(要素,文字形式)

参与者(三类):人,外部系统,设备 用例: 系统外部可见的用例单元 表示前俩的关系:带箭头的实线(参与者1——用例1) 【实线为了观看我标红了,实际没有的】 1.i…

vue实现一个简单导航栏

Vue之简单导航栏 在vue中,想要实现导航栏的功能,除了用传统的a标签以外,还可以使用路由——vue-router来实现,前端小白在此记录一下学习过程(默认已经搭建好vue的脚手架环境): 建立项目并安装…

【数据结构-字符串 四】【字符串识别】字符串转为整数、比较版本号

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串转换】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

Andriod学习笔记(一)

写在前面的话 App开发的编程语言Java和KotlinXML App连接的数据库App工程目录结构模块级别的编译配置文件清单文件 界面显示与逻辑处理 安卓是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备。 Mininum SDK表示安卓该版本以上的设备都可以运行该…

Vue计算属性的使用

当我们想要通过data中运算得到一个新的数据时,我们就可以使用计算属性。比如:data里的单价price和数量number可以相乘计算总价sum,这个sum我们就称为计算属性。 计算属性的语法格式: computed:{ 计算属性名称 ( ) { return 计算…

LAS Spark 在 TPC-DS 的优化揭秘

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 文章主要介绍了火山引擎湖仓一体分析服务 LAS Spark(下文以 LAS Spark 指代)在 TPC-DS 上的性能突破与优化策略。TPC-DS 是一个模拟复杂数据…

4、在 CentOS 8 系统上安装 pgAdmin 4

pgAdmin 4 是一个开源的数据库管理工具,专门用于管理和操作 PostgreSQL 数据库系统。它提供了一个图形用户界面(GUI),使用户能够轻松地连接到 PostgreSQL 数据库实例,执行 SQL 查询,管理数据库对象&#xf…

网络拓扑自动扫描工具

topology-scanner Topology-Scanner是WeOps团队免费开放的一个网络拓扑自动扫描模块,可以自动发现网络设备的类型、网络设备之间的互联 使用方式 java -jar ./topology-scanner.jar --config_path./config/ 配置说明 1. 拓扑发现请求参数文件(request.json) i…

Web3 新手攻略:9 个不可或缺的 APP 助力你踏入加密领域

Web3世界充满了无限机遇,但要掌握它,您需要合适的工具���。今天,我将为您介绍9款Web3必备APP,涵盖钱包、DEX、和工具三大类别。而且,我要特别强烈推荐一个强大的钱包——Bitget Wall…

基于java+vue+springboot的家庭理财记账信息网站

运行环境 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven 项目介绍 在这科技…

Bitxhub跨链平台

BitXHub跨链平台 跨链系统架构 过程 在跨链合约中调用统一写好的Broker合约Broker合约抛出事件由Plugin捕获到封装成平台统一的数据结构提交到中继链中目的链的跨链网关从中继链中同步IBTP数据结构网关将该数据结构通过Plugin提交到目的链 中继链体系架构 中继链的模块和流程…

【Vue面试题十七】、你知道vue中key的原理吗?说说你对它的理解

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:你知道vue中key的原理吗…

10.本项目的简单介绍及所用工具

本项目的简单介绍及所用工具 本项目的层次架构适合初学者或者有一些基础的同学,项目整体简单明了,有着非常严谨的逻辑思维,并且在前面文章中也讲了一些项目中所需要的软件安装配置以及一些前置的在本项目中所需要的java基础知识。 项目名称 …

TCPUDP

TCP 1.什么是TCP TCP是处于运输层的通信协议,该协议能够实现数据的可靠性传输。 2.TCP报文格式 源端口和目的端口:各占两个字节,发送进程的端口和接收进程的端口号。 序号:占4个字节,序号如果增加到溢出,则下一个序…

几种预训练模型微调方法和peft包的使用介绍

文章目录 微调方法Lora(在旁边添加训练参数)Adapter(在前面添加训练参数)Prefix-tuning(在中间添加训练参数)Prompt tuning PEFTPEFT 使用PeftConfigPeftModel保存和加载模型 微调方法 现流行的微调方法有:Lora,promp…

【MySql】5- 实践篇(三)

文章目录 1. 日志和索引问题1. 日志相关问题1.1 两阶段提交 2. 业务设计相关问题 2. order by工作原理2.1 全字段排序2.2 rowid 排序2.3 全字段排序 VS rowid 排序 3. 正确显示随机消息3.1 内存临时表3.2 磁盘临时表3.3 随机排序方法 1. 日志和索引问题 1. 日志相关问题 1.1 …

NodeJs内置模块child_process

内置模块child_process子进程 写在前面 子进程是Nodejs的核心Api,如果你会shell命令,它会有非常大的帮助,或者你喜欢编写前端工程化工具之类,它也有很大的用处,以及处理CPU密集型应用。 创建子进程 Nodejs创建子进…

如何处理用户输入验证和表单提交?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一)

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 离散点云重建为mesh网格模型,并保存到PLY文件中,用于其他软件打开查看,代码非常简短,复制粘贴即可迅速上手使用,具体参数根据自己的点云数据…