GUI编程--PyQt5--QTreeWidget

文章目录

  • 树型控件展示数据
  • 修改节点数据
  • 获取所有节点的数据

Qt模组参考
QWidgets
QTreeWidget

树型控件展示数据

展示数据的同时,每个节点标注数据类型。
在这里插入图片描述


class MyWindow(QWidget):
    def __init__(self, title):
        super(MyWindow, self).__init__()
        self.setWindowTitle(title)
        self.resize(500, 300)
        self.set_ui()

    def set_ui(self):
        # 显示图片
        label = QLabel(self)
        label.setText("xxxxx")
        qimg = QPixmap("./bg.jpg")
        qimg.scaledToHeight(120)
        qimg.scaledToWidth(200)
        label.setPixmap(qimg)
        label.resize(200, 120)
        label.move(100, 200)

        # QTreeWidget
        self.q_tree = QTreeWidget(self)
        self.q_tree.setColumnCount(3)
        self.q_tree.setHeaderLabels(["a", "b", "c"]) # 设置表头
        self.q_tree.setFixedWidth(500)
        self.q_tree.setFixedHeight(460)
        self.q_tree.move(80, 80)
        self.q_tree.itemDoubleClicked.connect(self.modify_slot)
        # 选择不同的节点时的信号
        # self.q_tree.currentItemChanged.connect(self.data_change_slot)
        # data
        data = {
            "d1": {
                "name": "jack",
                "age": 20,
                "friends": ["tom", "lucy"],
                "bid": [1, 3, 6]
            },
            "d2": [1.4, 3.2, 6.7],
            "d3": 3.14
        }
        # 展示数据
        self.show_data(data)

    def show_data(self, data):
        """ 展示数据 """
        for k, v in data.items():
            if isinstance(v, dict):
                node = QTreeWidgetItem(self.q_tree)
                node.type_ = dict
                node.setText(0, k)
                self.show_dict(v, node)
            elif isinstance(v, list):
                node = QTreeWidgetItem(self.q_tree)
                node.type_ = list
                node.setText(0, k)
                self.show_list(k, v, node)
            else:
                node = QTreeWidgetItem(self.q_tree)
                node.type_ = type(v)
                node.setText(0, k)
                node.setText(1, str(v))

    def show_list(self, key, data, root):
        """ 展示列表 """
        for idx, v in enumerate(data):
            if isinstance(v, dict):
                node = QTreeWidgetItem(root)
                node.type_ = dict
                node.setText(0, str(idx))
                self.show_dict(v, node)
            elif isinstance(v, list):
                node = QTreeWidgetItem(root)
                node.type_ = list
                node.setText(0, str(idx))
                self.show_list(idx, v, node)
            else:
                node = QTreeWidgetItem(root)
                node.type_ = type(v)
                node.setText(0, key + f"[{root.childCount() - 1}]")
                node.setText(1, str(v))

    def show_dict(self, data, root):
        """ 递归展示字典 """
        for k, v in data.items():
            if isinstance(v, dict):
                node = QTreeWidgetItem(root)
                node.type_ = dict
                node.setText(0, k)
                self.show_dict(v, node)
            elif isinstance(v, list):
                node = QTreeWidgetItem(root)
                node.type_ = list
                node.setText(0, k)
                self.show_list(k, v, node)
            else:
                node = QTreeWidgetItem(root)
                node.type_ = type(v)
                node.setText(0, k)
                node.setText(1, str(v))

    def data_change_slot(self, *args):
        print("args:", args)

    def modify_slot(self, treeWidgetItem, idx):

        cur_value = treeWidgetItem.text(idx)
        print("cur_value:", cur_value, treeWidgetItem.type_)

        # 设置节点可编辑
        treeWidgetItem.setFlags(treeWidgetItem.flags() | Qt.ItemIsEditable)
        # 设置编辑框的样式

        # QTreeWidgetItem

修改节点数据

  • 双击每个节点,实现修改数据item.setFlags(Qt.ItemIsEditable);
  • 可编辑时,设置样式
在这里插入代码片

获取所有节点的数据

  • 数据还原为字典;
  • 数据类型还原;
在这里插入代码片

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

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

相关文章

【SpringBoot篇】分页查询 | 扩展SpringMvc的消息转换器

文章目录 🛸什么是分页查询🌹代码实现⭐问题🎄解决方法 做了几个项目,发现在这几个项目里面,都实现了分页查询效果,所以就总结一下,方便学习 我们基于黑马程序员的苍穹外卖来讲解分页查询的要点…

el-table中el-popover失效问题

场景:先有一个数据表格,右侧操作栏为固定列,另外有一个字段使用了el-popover来点击弹出框来修改值,发现不好用,点击后无法显示弹出框,但当没有操作栏权限时却意外的生效了。 这种问题真是不常见&#xff0…

【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I)

目录 A、求全是字母的最小十六进制数 B、Excel表格组合 C、求满足条件的日期 D、 取数字 - 二分 (1)暴力 (2)二分 E、最大连通块 - bfs F、哪一天? G、信号覆盖 - bfs (1)bfs&#xf…

指静脉采集模组之调节Sensor

修改程序中gc0308_sensor_default_regs[]的类容,0x22寄存器的值改为0x55,关闭白平衡,0xd2寄存器的值改为0x10,关闭自动曝光。目前输出的图像没有自动曝光和自动白平衡,但是帧率比之前更低了。 以下是开启曝光模式和关闭曝光模式下…

论文排版一步搞定之图表题注——(图标自动编号,引用题注)

同学们在撰写研究生毕业大论文时,一定会进行章节的多次调整,不到最后一刻很难定稿。此时,一幅插图或表格位置的变化可能会导致此章内大部分插图或表格编号的变化,插图和表格编号的改变同样会使得前文的引用发生变化。牵一发而动全…

idea中误删.iml和.idea文件,如何处理

目录 一、问题描述 二、解决方案 1、理论知识 (1).iml 文件 (2).idea文件 2、操作环境 3、操作步骤 (1)找到【Maven】工具按钮 (2)点图标,重复导入maven项目&am…

【操作系统】内存的非连续分配管理

文章目录 前言非连续分配管理基本分页存储管理方式基本地址变换机构具有快表的地址变换机构两级页表 基本分段存储管理方式段页式管理方式 前言 在了解完内存的连续分配管理的三种方式后,可以看到它们之所以称之为连续分配是因为都有一个共同特点:每个进…

设计模式-适配器-笔记

适配器模式Adapter 动机(Motivation) 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是在这些现存对象所不满足的。 如何应对这种“迁移的变化”&#xff1…

QNX Typed memory介绍

文章目录 前言一、什么是 Typed memory二、查看系统已有Typed memory 的方法三、Typed memory 的使用方法1.定义一个packet memory并从系统内存中分出它1.1 as_add()1.2 as_add_containing()2. 从 Typed memory 中申请内存2.1 POSIX method 申请内存2.2 QNX Neutrino method 申…

redis设置密码

首先到redis的下载目录下:运行 redis-cli 查看redis密码: config get requirepass 设置redis密码为123456: config set requirepass 123456

GDS 命令的使用 srvctl service TAF application continuity

文档中prim and stdy在同一台机器上,不同机器需要添加address list TAF ENABLED GLOBAL SERVICE in GDS ENVIRONMNET 12C. (Doc ID 2283193.1)​编辑To Bottom In this Document Goal Solution APPLIES TO: Oracle Database - Enterprise Edition - Version 12.1.…

Windows系统中搭建docker (ubuntu,Docker-desktop)

一、docker安装前的准备工作 1. 开启CPU虚拟化,新电脑该默认是开启的,如果没开启可以根据自己电脑型号品牌搜索如克开启CPU虚拟化。当开启成功后可在设备管理器中看到。 2.开通Hyper-V 通过 Windows 控制面板 --> 程序和功能 -->启用或关闭…

系列五、JVM的内存结构【PC寄存器】

一、位置 CPU中 二、作用 每个线程都有一个程序计数器,是线程私有的,所谓PC寄存器其实就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将要执行的指令代码),由执行引…

基于PHP的纺织用品商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的纺织用品商城系统 一 介绍 此纺织用品商城系统基于原生PHP开发,数据库mysql,前端bootstrap。用户可注册登录,购物下单,评论等。管理员登录后台可对纺织用品,用户&#xf…

一文浅入Springboot+mybatis-plus+actuator+Prometheus+Grafana+Swagger2.9.2开发运维一体化

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTFUL风格的Web服务,是非常流行的API表达工具。 Swagger能够自动生成完善的 RESTFUL AP文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。 Prometheus 是一个开源的服务监控系统和时…

​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​

软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】 课本里章节里所有蓝色字体的思维导图

锂离子电池充电管理芯片应用

基本概述 TP4054是一个完善的单片锂离子电池恒流/恒压线性电源管理芯片。 更值得一提的是,TP4054专门设计适用于USB的供电规格。得益于内部的MOSFET结构,在应用上不需要外部电阻和阻塞二极管。在高能量运行和高外围温度时,热反馈可以控制充…

uniapp Android如何授权打开系统蓝牙Bluetooth?

uniapp Android如何授权打开系统蓝牙? 使用uniapp开发蓝牙项目过程中,涉及到检测手机系统蓝牙是否打开功能,这里介绍Android,iOS暂时没有找到优方法。朋友们如果有好的方案,欢迎评论分享~ 文章目录 uniapp Android如何…

SDL音视频渲染

01-SDL简介 官网:https://www.libsdl.org/ 文档:http://wiki.libsdl.org/Introduction SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函…

ESP32 Arduino实战基础篇-使用 ADC 读取模拟值

本文介绍如何使用 Arduino IDE 读取 ESP32 的模拟输入。模拟读数对于读取电位计或模拟传感器等可变电阻器的值非常有用。 使用 ESP32 读取模拟输入就像使用模拟读取(GPIO)函数,它接受您想要读取的 GPIO 作为参数。 模拟输入 (ADC) 使用 ESP32 读取模拟值意味着您可以测量 0 …