Qt QTreeWidget节点的添加+双击响应+删除详解

2023-05-16

QTreeWidget是实现树形结构的类,在很多软件中都可以看到类似树形结构的界面。

我做的一个示例如下图,用来处理图像,最顶层节点是图像的路径名,子节点是图像的各个波段,双击各个波段会显示图像各波段的灰度图像,同时还有删除指定节点(父节点和子节点同时删除)的功能。效果如下所示

要完成这样的功能需要注意一下几点:

①.在内存中保存各个节点,当然要在堆上分配内存,删除节点时,除了去除QtreeWidget控件上的节点外,还要讲存储在内存中的节点也要删除,否则会出现内存泄露的问题。

②.节点双击的事件响应,准确定位到是哪个图像的哪个波段。

下面详细叙述。

1.变量

需要有个变量记录图像的路径名,这里定义一个容器,数据类型为QString

QVector<QString> imgFile;

2.定义信号和槽

需要三个槽,

打开菜单:每使用打开菜单打开一幅图像就将该图像的路径名和波段数设计成父节点和子节点添加到QTreeWidget控件中。

删除节点的按钮:删除指定节点(该节点处于高亮状态,即选中状态)

双击某波段:显示该波段的灰度图像。

这里着重讲解与QTreeWidget相关的,因此有关显示图像的内容概不论述。

信号与槽链接如下:

打开菜单      connect(ui.Open,SIGNAL(triggered()),this,SLOT(menu_Open()));

双击某波段   connect(ui.treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(showSelectedImg(QTreeWidgetItem*,int)));

删除节点      connect(ui.DeleteNode,SIGNAL(clicked()),this,SLOT(btn_DeleteNode()));

3.打开图像(添加节点)


    imgFile.append(fileName);//影像路径添加进容器
    QTreeWidgetItem *item=new QTreeWidgetItem(ui.treeWidget,QStringList(QString(fileName)));//添加节点
    //添加子节点
    for (int i=0;i<rasterNum;i++)
    {
        QTreeWidgetItem *item1=new QTreeWidgetItem(item,QStringList(QString("Band")+QString::number(i+1)));
        item->addChild(item1);
    }  

其中rasterNum为路径名为fileName的图像的波段数。

这样在QTreewidget部件对象treeWidget中就增加了树节点及其子节点。每次打开都会在树形节点最后面添加。

这里需要提醒一点:这里的QTreewidgetItem指针对象指向的地址都分配在堆上,会不会造成内存泄露呢?因为函数结束后作为局部变量的指针当然是消失了,但保存QTreeWidgetItem节点的内存地址还在,有没有办法在需要的时候将其内存地址释放掉呢,答案是肯定的,将在后面删除节点时论述。

4.双击某波段显示波段图像


        QTreeWidgetItem *parent=item->parent();//获得父节点
    if(NULL==parent)
        return;
    progessBar->setValue(0);//进度条置0
    int row=parent->indexOfChild(item);//获得节点在父节点中的行号(从0开始)
    QString fileName=parent->text(0);//获得父节点的文本字符(即影像路径)
    /* QString->const char* */
    QByteArray ba=fileName.toLocal8Bit();
    const char* filePath=ba.data();  

这里贴出的是找到图像路径和子节点波段的方法,至于显示出图像就是根据图像路径和波段号显示出波段响应灰度图像,该问题不在讨论范畴,略去。

5.删除节点

这里的删除节点不是删除所有节点,而是删除与该节点有关的图像的所有节点,比如,鼠标指向了最开始图中第二个父节点的任意一个子节点,则就将该父节点和所有子节点删除。


    QTreeWidgetItem* item=ui.treeWidget->currentItem();//获得当前节点
    if(NULL==item)//没有选择节点
        return;
    QTreeWidgetItem* parent=item->parent();//获得当前节点的父节点
    int index;//top节点的索引号
    if(NULL==parent)//item就是top节点
    {
        QString fileName=item->text(0);//获得top节点的文本字符(即影像路径)
        for (int i=0;i<imgFile.size();i++)
        {
            if (fileName==imgFile.at(i))
            {
                index=i;
                break;
            }
        }
        ui.treeWidget->takeTopLevelItem(index);//去除节点 Removes the top-level item at the given index in the tree and returns it
        imgFile.remove(index);//移除容器index处内容

        //释放掉存放节点的内存空间
        int childCount=item->childCount();//子节点数
        for (int i=0;i<childCount;i++)
        {
            QTreeWidgetItem* childItem=item->child(0);
            delete childItem;
            childItem=NULL;
        }
        delete item;
        item=NULL;
    }
    else//parent才是top节点
    {
        QString fileName=parent->text(0);//获得top节点的文本字符(即影像路径)
        for (int i=0;i<imgFile.size();i++)
        {
            if (fileName==imgFile.at(i))
            {
                index=i;
                break;
            }
        }
        ui.treeWidget->takeTopLevelItem(index);//去除节点 Removes the top-level item at the given index in the tree and returns it
        imgFile.remove(index);//移除容器index处内容

        //释放掉存放节点的内存空间
        int childCount=parent->childCount();//子节点数
        for (int i=0;i<childCount;i++)
        {
            item=parent->child(0);
            delete item;
            item=NULL;
        }
        delete parent;
        parent=NULL;
    }  

主要方法就是根据图像路径名获得图像在top节点中的索引号,然后将top节点及其子节点删除,采用takeTopLevelItem(index)方法可以把treeWidget中的所因为index的节点去除掉,注意这里只是将节点从treeWidget中去除掉,其节点(父节点+子节点)仍然存在内存中,所以还要讲内存中的地址也要释放掉,否则就会出现所谓的内存泄露的问题。所采用的方法时使用QTreeWidgetItem指针找到存放节点的内存地址,然后将其delete掉,如此就释放掉内存空间了(有疑问的可以跟踪调试下),一定注意将要删除的节点全部delete掉,先释放子节点内存,再释放父节点内存。

还需要注意的是,每清除掉一个子节点的内存空间,对应父节点就会失去该子节点,因此每次都是清理掉父节点索引为0的子节点,即获得child(0)的子节点。此外不要忘了保存图像路径的向量imgFile中也要去除对应的索引内容。

总结

以上给出的是实现功能的核心实现部分,并非完整的程序,其他未论述的都是与QTreeWidget该控件无关的了。上述方法可移植性强,可以用到有类似需求的地方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt QTreeWidget节点的添加+双击响应+删除详解 的相关文章

  • 最简单的目标跟踪方法--------模板匹配与相关系数法

    前言 模板匹配和相关系数法是目标跟踪的经典方法 xff0c 它的优点有很多 xff1a 简单准确 xff0c 适用面广 xff0c 抗噪性好 xff0c 而且计算速度快 缺点是不能适应剧烈光照变化和目标剧烈形变 所谓模板匹配法 xff0c
  • HDFS 实验 (一) 原理

    原文在此 https hadoop apache org docs r1 2 1 hdfs design html hadoop 两大组件 mapreduce和hdfs 用HDFS的目标 避免硬件故障 硬件故障是常态 xff0c 而不是例外
  • 开启CentOS 5.4下的vncserver服务

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 开启CentOS 5 4下的vncserver服务 安装好CentOS 5 4后 xff0c 虽然我们可以通过ssh来远程登陆服务器 xff0c 但是我们使用ssh 毕竟是
  • 深度学习哪家强?吴恩达、Udacity和Fast.ai的课程我们替你分析好了

    摘要 xff1a 本文从指导老师 课程概述 课程亮点 课程局限以及所需费用这五个方面进行了分析比较 翻译 AI科技大本营 xff08 rgznai100 xff09 参与 reason W 引言 过去2年 xff0c 我一直积极专注于深度学
  • Ubuntu 16.04上挂载iscsi自动启动

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 Ubuntu16 04安装之后默认安装有open iscsi服务 xff0c 如果没有 xff0c 可使用apt get y install open iscsi命令安
  • 使用Xmanager - Passive打开远程最小化方式安装的CentOS 6.10的图形化界面

    在安装 WebLogic 或者 Oracle 时需要用到图形界面 xff0c 比如 WebLogic 11g xff08 10 3 6 xff09 xff0c 默认使用命令行方式安装 xff1a 如果需要使用图形界面方式安装 xff0c 可
  • openstack 功能_2016年OpenStack的新功能:看一下Newton版本

    openstack 功能 OpenStack的发布周期为六个月 xff0c 每个发行版都有一个代号 xff0c 名称以字母的连续字母开头 10月7日 xff0c OpenStack Newton发布了 让我们看一下OpenStack 201
  • 面试官:“谈谈Spring中都用到了那些设计模式?”。

    我自己总结的Java学习的系统知识点以及面试问题 xff0c 已经开源 xff0c 目前已经 41k 43 Star 会一直完善下去 xff0c 欢迎建议和指导 xff0c 同时也欢迎Star xff1a github com Snailc
  • 制作Visual Studio项目模板

    在安装MVC xff0c ASP NET AJAX 后都会在新建工程列表中出现一些新的项目模板 xff0c 通过这些项目模板创建工程后 xff0c 都会为我们做好一些这些工程需要的配置 xff0c 或者干脆就创建一些示例工程 xff0c 为
  • samba常用命令

    1 smbstatus Samba version 3 6 23 PID Username Group Machine Service pid machine Connected at No locked files 2 wbinfo t
  • Kubernetes Service

    Service 的作用 参考链接 虽然每个Pod都有自己的IP地址 xff0c 但即使这些IP地址不能长期保持稳定 这导致了一个问题 xff1a 如果一些Pod xff08 称为它们的后端 xff09 为Kubernetes集群内的其他Po
  • Ubuntu 14.04.2安装内核源码树以及编译

    一 安装内核源码树 方法1 xff1a 使用dpkg dev 43 apt get source安装内核源码树 在下载内核源码之前 xff0c 先安装dpkg dev xff0c 其中包含你在Debian上生成源代码时需要的开发工具套 件
  • iphone 屏蔽系统自动更新,消除设置上的小红点

    苹果ios系统的更新频率大家应该都知道 xff0c 一般来说1个月就会来次更新 这一点让很多人讨厌 主要原因还是iPhone会自动下载更新包 xff0c 然后一直不停地提示你是否安装更新 xff0c 问题是我们还找不到关闭提醒和关闭自动下载
  • Ambari集群里操作时典型权限问题put: `/home/bigdata/1.txt': No such file or directory的解决方案(图文详解)...

    不多说 xff0c 直接上干货 xff01 问题详情 明明put该有的文件在 xff0c 可是怎么提示的是文件找不到的错误呢 xff1f 我就纳闷了put 96 home bigdata 1 txt 39 No such file or d
  • linux服务器账号密码正确无法登录

    登录服务器时 xff0c 发现密码错误 xff0c 输入后还是错误不能登录 最后发现登录日志中有pam tally2 sshd auth user root 0 tally 53 deny 6 less var log secure 查看发
  • &1的用法

    看到不少大神都喜欢用 amp 1来判断一些东西 xff0c 但是作为渣渣的我总是不理解这个 amp 1到底是有什么作用 今天写了程序看了一下 xff0c 其实是判断奇偶用的 如果是奇数 xff0c 其结果为1 xff0c 偶数结果为fals
  • 程序员写了这5000行代码,应聘开口要20K,HR会给吗?

    今天在家乡的一个it专栏上看到一位程序员写他自己面试前端的过程 xff0c 一个水果忍者项目和一个电商平台项目 xff0c 期望工资是20K xff0c 已经有三年工作经验了 xff0c 小编我也把这位小伙的项目COPY过来 xff0c 这
  • 使用Stratis在Linux中配置本地存储

    配置本地存储是台式机Linux用户很少执行的操作 在安装过程中可能只有一次 Linux存储技术发展缓慢 xff0c 如今20年前仍在使用许多存储工具 但是从那以后有些事情有所改善 人们为什么不利用这些新功能 xff1f 本文介绍Strati
  • 如何安装和配置OnlyOffice

    功能介绍 ONLYOFFICE是一款集成了文档 电子邮件 事件 任务和客户关系管理工具的开源在线办公套件 其文档管理功能实现了文档的在线编辑 在线预览和协同管理 xff0c 可用于替代Office365或Google docs 另外 xff
  • 初探Nacos(一)-- 单机模式启动

    花小钱 xff0c 周边游 xff0c 马上抢 xff0c 请关注公众号 xff1a 爱订不订 作者 xff1a 唐璜 前言 Nacos 支持基于 DNS 和基于 RPC 的服务发现 xff08 可以作为springcloud的注册中心 x

随机推荐

  • 筹码集中度90与70区别是什么?

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 筹码集中度是指一只个股的筹码被庄家掌握的程度 我们看到不同的数值 xff0c 比如说90和70 xff0c 很多的股民都不知道筹码集中度90与70区别是什么 下边小编会为大
  • Caused by: org.xml.sax.SAXParseException: 文件提前结束。

    Error starting ApplicationContext To display the auto configuration report re run your application with 39 debug 39 enab
  • AHB总线协议(一)

    1 简介 AHB Advanced High Performance Bus 总线规范是AMBA Advanced Microcontroller Bus Architecture V2 0总线规范的一部分 xff0c AMBA总线规范是A
  • iOS 4.5.5版本 被拒绝!!!! "App Rejected : non-public APIs"

    今天上午收到邮件说是被拒绝了 原文是 这一版本 我就添加一个购买sku的方法 并没有添加什么库 简简单单的一次升级给我出一私有方法拒绝 在xcode8 iOS10 刚出来 苹果新规则进一步丰富 出现这种意外的问题 一定不只我一个 的确 我在
  • 删除文件夹及其子文件

    rm rf 目录 转载于 https www cnblogs com tiandsp archive 2012 07 09 2583207 html
  • 树莓派练习程序(土壤湿度检测)

    土壤湿度检测模块如下 xff1a 树莓派的引脚如下图 xff1a 我们将Vcc引脚连接物理接口2 xff0c GND引脚连接物理接口39 xff0c DO引脚连接物理接口40 实物连接如下图 xff1a 编程使用WiringPi库 xff0
  • 搞定面试问题-进程、线程、协程

    关于进程 xff0c 线程 xff0c 协程是面试中经常可见的问题 xff0c 接下来这篇文章帮你梳理一下 xff0c 让你轻松应对面试官 1 xff0c 什么是进程 一个程序的执行实例就是一个进程 每一个进程提供执行程序所需的所有资源 x
  • OVN 架构分析

    架构分析Base flow L2 L3 forwardingOVN L2 gateway OVN 是 Open vSwitch 社区在 2015 年 1 月份才宣布的一个子项目 xff0c OVN 使用 Open vSwitch功能提供一个
  • fyi 在邮件里是什么意思_FYI的完整形式是什么?

    fyi 在邮件里是什么意思 仅供参考 xff1a 供您参考 FYI For Your Information FYI is an acronym of 34 For Your Information 34 It is a widesprea
  • Maven war包相互依赖

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 假设有两个war包 xff1a A和B A又依赖于B 根据Java规范 xff0c classpath不能指定WAR文件 这就意味着在编译时 xff0c A项目无法访问B项
  • 没事儿乱冒点皮皮

    快一个月没写Blog了 xff0c 这段时间忙着应付考试 xff0c 也就没花太多的时间管这些 前天刚刚考完四级 xff0c 感觉还不错 xff0c 希望能过吧 xff0c 虽然这次我还是没怎么努力学英语 xff0c 如果说真的过了 xff
  • AutoLISP对话框DCL按钮Button设计实例

    AutoLISP对话框DCL按钮设计实例 xff0c 绘制三种形式的图形 xff0c DCL对话框设计代码如下 dia5b dialog label 61 34 按钮测试 34 boxed row label 61 34 图形尺寸 34 e
  • 教你如何修改运行中的docker容器的端口映射

    在docker run创建并运行容器的时候 xff0c 可以通过 p指定端口映射规则 但是 xff0c 我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改 当docker start运行容器后并没有提供一个 p选项或设置 xff0c
  • svn status 显示 ~xx

    版本控制下的项目与其它类型的项目重名
  • python键盘输入转换为列表_Python键盘输入转换为列表的实例

    Python键盘输入转换为列表的实例 发布时间 xff1a 2020 08 19 12 58 38 来源 xff1a 脚本之家 阅读 xff1a 92 作者 xff1a 清泉影月 Python输入字符串转列表是为了方便后续处理 xff0c
  • 如何调试带有源代码的dll文件

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 工作环境 xff1a dll源代码是c xff0c 在Visual studio 2010中调试 第一步 xff0c 调试的准备 用C 语言编写一个测试dll文件的程序 x
  • (网上搜集)金蝶报错:名称或代码在系统中已被使用

    KIS专业版 修正核算项目关系 select from t itemdetail exec sp cleanitemdetailv GO update a set a fdetailcount 61 b Fcount from t item
  • Xmanager 远程连接linux ubuntu桌面操作系统

    Xmanager 远程连接linux ubuntu桌面操作系统 Xmanager 下载地址 url http dl pconline com cn download 53773 html url 1 ubuntu desk操作系统的配置 系
  • c语言中strtok函数_在C语言中使用strtok()和strtok_r()函数

    c语言中strtok函数 In this article we ll take a look at using the strtok and strtok r functions in C 在本文中 xff0c 我们将介绍如何在C语言中使用
  • Qt QTreeWidget节点的添加+双击响应+删除详解

    QTreeWidget是实现树形结构的类 xff0c 在很多软件中都可以看到类似树形结构的界面 我做的一个示例如下图 xff0c 用来处理图像 xff0c 最顶层节点是图像的路径名 xff0c 子节点是图像的各个波段 xff0c 双击各个波