入门 PyQt6 看过来(案例)20~ 动态树

news2024/9/26 1:27:03

1 QTreeWidget树类

QTreeWidget类可以呈现数组、数列等数据,并且可以进行交互,它使用标准的数据模型,其单元格数据通过QTableWidgetItem对象来实现。

QTreeWidget继承自QTreeView,是封装了默认Model的QTreeView,其中的元素属于QTreeWidgetItem类型,插入后就是树节点,delete方法可以删除节点。

QTreeWidget常用方法如下:

方法描述
setColumn Width(列,宽度)设置指定列的宽度
insertTopLevelItems()在视图的顶层索引中插入项目列表
expandAll()展开所有树形节点
invisibleRootItem()返回树形控件中不可见的根选项(Root Item)
selectedItems()返回所有选定的非隐藏项目的列表

QTreeWidgetItem类常用的方法如下:

方法描述
addChild()将子项追加到子列表中
setText()设置显示的节点文本
Text()返回显示的节点文本
setCheckState(列,状态)设置指定列的选中状态(Qt.CheckState.X):
Checked:节点选中
UnChecked:节点未选中
setIcon(列,图标)在指定的列中显示图标

2 树和节点

树形结构是通过QTreeWidget和QTreeWidgetItem类实现的,前者为树,后者为节点。QTreeWidget对象创建后是没有任何项的,首先要增加顶层项,方法有以下三种。

(1)在QTreeWidgetItem中构造方法时,直接将QTreeWidget对象作为参数传递进去。

(2)利用QTreeWidget的隐形根节点,调用QTreeWidgetItem相关方法增加子项即可。

(3)直接调用QTreeWidget相关方法。

追加顶层项:树对象创建以后,通过addTopLevelItem(QTreeWidgetItem item)方法在顶层项加入item项的顶层项,也可以通过addTopLevelItems(iter[QTreeWidgetItem] items)将一个迭代类型items中的多个项加入顶层项的最后。

如果要插入的项已经在树对象中,则该项不会重复加入,如果是多项中有部分项已经在树对象中,则重复项不会加入。

插入顶层项:通过insertTopLevelItem(int index, QTreeWidgetItem item)方法在树对象顶层项列表的index位置插入item对应项,该位置及其后的项目自动后移,也可以通过insertTopLevelItems(int index,(iter[QTreeWidget] items))将一个迭代类型items中多个项从index位置开始顺序插入,原位置的项自动后移。

3 案例

# -*- coding:utf-8 -*-
"""
------------------------------------------------
File Name: 树的动态节点.py
Description:
Author: lzq
date:2024-08-02 09:42
------------------------------------------------
"""
import sys
from PyQt6.QtWidgets import QDialog, QPushButton, QVBoxLayout, QApplication, QWidget, QHBoxLayout, QTreeWidget, \
    QTreeWidgetItem, QLineEdit


class MyWidget(QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)
        self.setWindowTitle("TreeWidget测试")
        #设置3个命令按钮,水平布局
        hLayBtn=QHBoxLayout()
        pbAdd=QPushButton('添加')
        pbUpdate=QPushButton('修改')
        pbDel=QPushButton('删除')
        pbAdd.clicked.connect(self.addTreeNode)
        pbUpdate.clicked.connect(self.updateTreeNode)
        pbDel.clicked.connect(self.delTreeNode)
        hLayBtn.addWidget(pbAdd)
        hLayBtn.addWidget(pbUpdate)
        hLayBtn.addWidget(pbDel)
        #树tree:设置列数为1,“名称”标题,设置树节点
        self.tree=QTreeWidget(self)
        self.tree.setColumnCount(1)
        self.tree.setHeaderLabels(['名称'])#设置标题
        #在tree中创建root节点
        root=QTreeWidgetItem(self.tree)
        root.setText(0,'学校')
        #在root中创建child1节点
        childXy1=QTreeWidgetItem(root)
        childXy1.setText(0,'学院1')
        childXy2 = QTreeWidgetItem(root)
        childXy2.setText(0, '学院2')
        childXi = QTreeWidgetItem(childXy2)
        childXi.setText(0, '1系')
        #root节点作为顶层节点
        self.tree.addTopLevelItem(root)
        self.tree.expandAll()
        #把1个单元行文本框、水平布局的4个命令按钮和树进行垂直布局
        vLayout=QVBoxLayout(self)
        self.le=QLineEdit()
        vLayout.addWidget(self.le)
        vLayout.addLayout(hLayBtn)
        vLayout.addWidget(self.tree)
        self.setLayout(vLayout)

    #添加节点
    def addTreeNode(self):
        item=self.tree.currentItem()
        newNode=QTreeWidgetItem(item)
        txt =self.le.text()
        if txt != '':
            newNode.setText(0, txt)

    #更新节点
    def updateTreeNode(self):
        item=self.tree.currentItem()
        txt =self.le.text()
        if txt != '':
            item.setText(0, txt)
    #删除节点
    def delTreeNode(self):
        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)
    w = MyWidget()
    w.show()
    sys.exit(app.exec())

思路如下:

(1) 创建单行文本框、3个命令按钮、树及初始节点

		#设置3个命令按钮,水平布局
        hLayBtn=QHBoxLayout()
        pbAdd=QPushButton('添加')
        pbUpdate=QPushButton('修改')
        pbDel=QPushButton('删除')
        pbAdd.clicked.connect(self.addTreeNode)
        pbUpdate.clicked.connect(self.updateTreeNode)
        pbDel.clicked.connect(self.delTreeNode)
        hLayBtn.addWidget(pbAdd)
        hLayBtn.addWidget(pbUpdate)
        hLayBtn.addWidget(pbDel)

(2)添加、删除和修改按钮关联对应其槽函数:

    #添加节点
    def addTreeNode(self):
        item=self.tree.currentItem()
        newNode=QTreeWidgetItem(item)
        txt =self.le.text()
        if txt != '':
            newNode.setText(0, txt)

    #更新节点
    def updateTreeNode(self):
        item=self.tree.currentItem()
        txt =self.le.text()
        if txt != '':
            item.setText(0, txt)
    #删除节点
    def delTreeNode(self):
        item=self.tree.currentItem()
        root=self.tree.invisibleRootItem()
        for item in self.tree.selectedItems():
            (item.parent() or root).removeChild(item)


本文至此结束,喜欢点赞关注,您的关注和点赞是路卿进步的动力哦!老Baby们!!!

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

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

相关文章

C++ | Leetcode C++题解之第312题戳气球

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxCoins(vector<int>& nums) {int n nums.size();vector<vector<int>> rec(n 2, vector<int>(n 2));vector<int> val(n 2);val[0] val[n 1] 1;for (int i 1; i &l…

ElasticSearch入门(六)SpringBoot2

private String author; Field(name “word_count”, type FieldType.Integer) private Integer wordCount; /** Jackson日期时间序列化问题&#xff1a; Cannot deserialize value of type java.time.LocalDateTime from String “2020-06-04 15:07:54”: Failed to des…

Django文件上传

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 本节主要介…

【计算机网络】IP地址和子网掩码(子网掩码篇)

个人主页:【😊个人主页】 系列专栏:【❤️计算机网络】 文章目录 前言什么是子网掩码?子网掩码的组成组成规则表示方法子网掩码的分类标准(默认)子网掩码:变长子网掩码(VLSM):全零和全一子网掩码:子网掩码的计算确定IP地址类别及默认子网掩码计算子网掩码根据子网数…

橙单中台化低代码生成器

​橙单中台化低代码生成器 在当今快速发展的软件开发领域&#xff0c;橙单中台化低代码生成器凭借其强大的功能和灵活的架构&#xff0c;成为了开发者不可或缺的利器。本文将介绍橙单的基本信息、特点以及如何快速部署和使用。 软件简介 橙单中台化低代码生成器是一款开源的低…

被华为的AI扩图震惊到,超自然超好看!

美颜、P图对大家来说都不陌生&#xff0c;但是近期在互联网实火的各种AI扩图你了解多少&#xff1f;它既能满足图片构图时进行延伸美化&#xff0c;又能在未知的创意里无限探索。 近期&#xff0c;华为Pura 70系列手机获推HarmonyOS 4.2.0.172 更新&#xff0c;华为Pura 70 Pr…

事务性邮件API的功能优势?考虑哪些指标?

事务性邮件API的性能如何优化&#xff1f;怎么选择邮件API接口&#xff1f; 在当今数字化时代&#xff0c;企业需要一种高效、可靠的方法与客户沟通。事务性邮件API成为解决这一需求的重要工具。AokSend将探讨事务性邮件API的功能优势及考虑的关键指标。 事务性邮件API&#…

如何在 Kubernetes 中使用 ClickHouse 和 JuiceFS

ClickHouse 结合 JuiceFS 一直是一个热门的组合&#xff0c;社区中有多篇实践案例。今天的文章来自美国公司 Altinity&#xff0c;一家提供 ClickHouse 商业服务的企业&#xff0c;作者是 Vitaliy Zakaznikov&#xff0c;他尝试了这个组合并公开了过程中使用的代码。原文有两篇…

基于DreamBooth的“妙鸭相机”——一次不太成功的实践

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

Encoder-Decoder:Seq2seq

目录 一、编码器解码器架构&#xff1a;1.定义&#xff1a;2.在CNN中的体现&#xff1a;3.在RNN中的体现&#xff1a;4.代码&#xff1a; 二、Seq2seq&#xff1a;1.模型架构&#xff1a;1.1编码器&#xff1a;1.2解码器&#xff1a; 2.架构细节&#xff1a;3.模型评估指标BLEU…

C# Unity 补全计划 泛型

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 1.什么是泛型 泛型&#xff08;Generics&#xff09;是C#中的一个强大特性&#xff0c;允许你编写可以适用于多种数据类型的可重用代码&#xff0c;而不需要重复编写…

第二证券:刚刚!亚太股市,跌麻了!

今天早盘&#xff0c;亚太股市全线崩跌。日经225指数在大幅低开之后快速下行&#xff0c;最大跌幅近5%&#xff1b;韩国、澳大利亚股指亦迎来逾越2%以上的暴降。那么&#xff0c;毕竟发生了什么&#xff1f; 剖析人士认为&#xff0c;或许仍是与日元套息有关。从前史来看&…

Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules。Android studio纯java代码报错

我使用java代码 构建项目&#xff0c;初始代码运行就会报错。我使用的是Android Studio Giraffe&#xff08;Adroid-studio-2022.3.1.18-windows&#xff09;。我在网上找的解决办法是删除重复的类&#xff0c;但这操作起来真的太麻烦了。 这是全部报错代码&#xff1a; Dupli…

mysql环境的部署安装及数据库的操作(twenty day)

一、centos7 中安装 mysql 8.x 1、下载安装包 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 2、解压 tar -zxvf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 3、卸载mariodb yum remove -y *mariadb* 4、依次安装依赖包…

SC215TA是C型/ PD和DPDM快速充电控制器,集成了内部反馈补偿PD3.0快充

SC215TA是C型/ PD和DPDM快速充电控制器&#xff0c;集成了内部反馈补偿。它符合最新的C型和PD 3.0标准&#xff0c;并支持专有的高压快速充电协议与DPDM接口。它的目标是旅行适配器的应用程序。SC215TA通过集成USB PD基带PHY、Type-C检测、DPDM PHY、VBUS放电路径、VCONN电源、…

旧衣回收小程序,旧衣回收行业新态势

进入网络时代后&#xff0c;互联网改变了大众的生活&#xff0c;传统的回收模式逐渐被淘汰&#xff0c;新兴的互联网旧衣回收受到了大众的关注&#xff01;通过技术创新为行业带来新模式&#xff0c;不断优化回收流程&#xff0c;提高回收效率&#xff0c;提升居民的回收体验&a…

Java编程达人:每日一练,提升自我

目录 题目1.以下哪个单词不是 Java 的关键字&#xff1f;2.boolean 类型的默认值为&#xff1f;3.以下代码输出正确的是&#xff1f;4.以下代码&#xff0c;输出结果为&#xff1a;5.以下代码输出结果为&#xff1a;6.以下代码输出结果为&#xff1f;7.float 变量的默认值为&am…

Three.js WebGPU 节点材质系统 控制instances的某个实例单独的透明度,颜色等属性

文章目录 1. 声明一个实例必要的属性instanceMatrix同级别的属性2. 在设置位置矩阵的时候填充这个数组3. 在shader中获取当前的索引4. 增加uniform5. 对比当前着色的实例是否是选中的实例6. 如果是选中的实例7. 影响片元着色器透明度参数 8.源码 写在前面 本文环境是 原生js 没…

EV代码签名证书申请流程

EV代码签名证书可以有效提高用户信赖。可以用于任何软件&#xff0c;支持Microsoft SmartScreen应用程序信誉功能以及对Windows 10内核驱动程序进行签名。 下面是EV代码签名证书的申请流程 代码签名证书_代码签名证书申请购买-JoySSL代码签名证书是对可执行脚本、软件代码和内容…

500+伙伴齐聚上海:纷享销客生态伙伴大会·上海站成功举办

近日&#xff0c;纷享销客生态伙伴大会上海站成功举办&#xff0c;此次会议汇聚了500余位来自各行各业的伙伴&#xff0c;齐聚一堂&#xff0c;共同探讨行业的未来发展趋势。 01、展望CRM市场 国内外双轮驱动&#xff0c;SaaS巅峰在价值创造与效率运营 纷享销客创始人兼CEO罗…