QTreeWidget 树遍历

在项目中遇到一个问题:需要将QString路径,做成一棵树的样式展示出来。其实倒不是说是问题,只是记录写这块儿的代码的思路
前提:我的所有的QString都是用"/"进行分割的,分割后的list中第一个元素是公共的路径,也就是树的根节点
举例:

string str1 = "A/B/B1/B2";
string str2 = "A/B/B1/B3";	
string str4 = "A/C/B3";
string str5 = "A/C/B1";
string str6 = "A/B/B2";

具体的代码如下:

// 定义的树控件 m_treeWidget 为成员变量
m_treeWidget->clear();// 设置根节点
QTreeWidgetItem *root = new QTreeWidgetItem(m_treeWidget); //树的根
m_treeWidget->addTopLevelItem(root);
// 将所有的路径写在一个 vector 中,用于遍历
string str1 = "A/B/B1/B2";
string str2 = "A/B/B1/B3";	
string str4 = "A/C/B3";
string str5 = "A/C/B1";
string str6 = "A/B/B2";
vector<string> vec;
vec.push_back(str1);
vec.push_back(str2);
vec.push_back(str4);
vec.push_back(str5);
vec.push_back(str6);
// 遍历所有路径 把所有路径按照"/"分割,保存在list中
for (int i = 0; i < vec.size(); i++)
{QString strFirst = QString::fromStdString(vec[i]);// 调用 split 分割QStringList nameListFirst = strFirst.split('/', Qt::SkipEmptyParts);if (i == 0){// 因为所有路径的第一个名称为根节点,所以只设置一次根节点的名称root->setText(0, nameListFirst[0]);}// 在后续递归的时候就不用第一个根节点了nameListFirst.removeAt(0);if (!nameListFirst.isEmpty()){this->traverseTree(root, nameListFirst);}
}
// 设置隐藏树的头部
m_treeWidget->setHeaderHidden(true);

递归的思想

  1. 判断当前节点的子节点个数是否为空,若为空说明有两种情况:
    当前是第一个list进入递归,树中还没有节点。或者当前节点是树的叶子节点了
    无论是哪种情况,都只需要把list中的值设置为当前节点的子节点就可以
    终止条件:list为空。list为空就说明,当前list中没有内容了,已经到叶子节点了
  2. 当前节点的子节点个数不为空,此时说明:
    当前节点已经在树中存在,那么就拿到当前节点的所有子节点,判断list[0]是否已经被包含在所有的子节点中
    如果是,说明list[0]中的名称已经存在子节点中了,则说明当前list[0]所在的节点已经在树上了,那么把list移除第一个元素,并且找到重合的节点。将移除后的list和该重合的节点作为参数传入递归中
    如果否,说明list[0]名称的节点没有在树上,这是就为树添加子节点,子节点的名称就是list[0]
    终止条件:当list为空,说明当前已经到叶子节点了,此时结束。

递归的代码

void traverseTree(QTreeWidgetItem * parent, QStringList& list)
{if (!parent){return;}QString name1 = parent->text(0);// 获取当前节点的子节点个数int childCount = parent->childCount();// 第一种情况,当前父节点的子节点为空,就为父节点添加子节点if (childCount == 0){QTreeWidgetItem *childItem = new QTreeWidgetItem(parent);// 为子节点设置名称,名称就是list[0]childItem->setText(0, list[0]);list.removeAt(0);// 终止条件:list为空,说明已经到了叶子节点了if (list.isEmpty()){return;}traverseTree(childItem, list);}else{// 第二种情况,当前父节点的子节点不为空// 找出当前父节点的所有子节点名称,保存在list中QStringList nodeList;for (int j = 0; j < childCount; j++){QTreeWidgetItem *childItem = parent->child(j);nodeList.append(childItem->text(0));}QString tempName = list[0];// 如果list[0]的名称已经包含在子节点名称中,则在所有的子节点中找到同名的节点if (nodeList.contains(tempName)){QTreeWidgetItem* node = new QTreeWidgetItem();for (int i = 0; i < childCount; i++){QTreeWidgetItem *childItem = parent->child(i);if (childItem->text(0) == tempName){node = childItem;}				}// 将list[0]移除list.removeAt(0);if (list.isEmpty()){return;}traverseTree(node, list);}// list[0]的名称不包含在子节点名称中,直接在父节点后添加子节点,节点名称就是list[0]else{		// 当前层不包括当前名,直接该名称追加在父节点后QTreeWidgetItem *childItem = new QTreeWidgetItem(parent);childItem->setText(0, list[0]);		list.removeAt(0);if (list.isEmpty()){return;}// 进入下一层迭代traverseTree(childItem, list);		}}
}

不得不感叹,之前写算法的时候写到树的深度和广度遍历,用纯C++写,虽然代码量也不多,但是要递归。现在用了QT,广度遍历直接一个接口就搞定了,封装好的接口真好用啊!!!

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

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

相关文章

知识改变命运 第二集:Java的数据类型与变量

数据类型与变量 1. 字面常量2. 数据类型3. 变量3.1 变量概念3.2 语法格式3.3 整型变量3.3.1 整型变量3.3.2 长整型变量3.3.3 短整型变量3.3.4 字节型变量 3.4 浮点型变量3.4.1 双精度浮点型3.4.2 单精度浮点型 3.5 字符型变量3.6 布尔型变量3.7 类型转换3.7.1 自动类型转换(隐式…

mybatilsplaus 常用注解

官网地址 baomidou注解配置

CATIA二次开发VBA入门(5)——catia文档操作vb.net程序案例,打开catia文件,进行视图操作,退出程序

目录 引出catia文档操作案例1.初始化窗体&#xff0c;始终置顶始终置顶方式2 2.打开文件3.视图切换4.退出5.完整代码 总结认识CATIA二次开发刘瑞欣 vb程序设计教程Excel中的vba开发catia中的vba开发 宏的录制、回放和编辑宏代码精简画圆柱阵列宏Macro文件的3种类型宏的保存&…

CSS 指南

CSS 指南 引言 CSS(层叠样式表)是网页设计和开发中不可或缺的一部分。它用于控制网页的布局和样式,使网页更加美观和易于浏览。本指南将为您提供CSS的基础知识,包括选择器、属性、值以及如何将CSS应用于HTML元素。 CSS基础 选择器 选择器是CSS中用于选择HTML元素的部分…

如何安全隐藏IP地址,防止网络攻击?

当您想在互联网上保持隐私或匿名时&#xff0c;您应该做的第一件事就是隐藏您的 IP 地址。您的 IP 地址很容易被追踪到您&#xff0c;并被用来了解您的位置。下面的文章将教您如何隐藏自己&#xff0c;不让任何试图跟踪您的活动的人发现。 什么是 IP 地址&#xff1f; 首先&am…

Apache Flink核心特性应用场景

Flink的定义 Apache Flink是一个分布式处理引擎&#xff0c;用于处理 无边界数据流&#xff0c; 有边界数据流上金秀贤有状态的计算。Flink能在所有常见的集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算如下Flink官网的一张图 Flink 与Spark的区别 Flink 中处…

keep-alive缓存组件

keep-alive缓存组件是Vue.js中的一个特殊组件&#xff0c;主要用于缓存内部组件的数据状态&#xff0c;以提高应用的性能和用户体验。以下是关于keep-alive缓存组件的详细解析&#xff1a; 一、作用 缓存组件状态&#xff1a;当组件在<keep-alive>内部切换时&#xff0…

白盒测试的概念、特点、应用阶段、实施流程、现状与前景

文章目录 前言一、白盒测试的应用阶段二、白盒测试的特点三、白盒测试的流程四、白盒测试的现状与前景总结 前言 白盒测试&#xff08;White Box Testing&#xff09;&#xff0c;又称为结构测试&#xff08;Structural Testing&#xff09;、透明盒测试&#xff08;Glass Box…

Riscv 调试系统的合规测试

Riscv debug release框图 仿真环境下的Riscv debug框图 平头哥调试环境 XuanTie DebugServer是一个调试代理软件&#xff0c;它通过CKLINK&#xff0c;以JTAG的方式连接目标板&#xff0c;并支持“GDB Remote Protocol” 。开发者可以通过GDB对运行在玄铁800系列和玄铁900系列处…

24.可乐机拓展练习--综合训练

&#xff08;1&#xff09;设计要求&#xff1a;仍以可乐机为背景&#xff0c;一瓶可乐的价格是2.5 元&#xff0c;用按键控制投币&#xff08;加入按键消抖功能&#xff09;&#xff0c;可以投 0.5 元硬币和 1元硬币&#xff0c;投入 0.5 元后亮一个灯&#xff0c;投入 1元后亮…

从微软 Word 中提取数据

从 Microsoft Word 文档中提取数据可以通过编程来实现&#xff0c;有几种常见的方法&#xff0c;其中之一是使用 Python 和 python-docx 库。python-docx 是一个处理 .docx 文件&#xff08;Microsoft Word 文档&#xff09;的 Python 库&#xff0c;可以读取和操作 Word 文档的…

语雀平替,一款私有化功能丰富的开源知识库系统

背景介绍 现代企业面临的文档管理挑战日益严峻&#xff0c;包括信息冗余&#xff0c;存在多份数据&#xff0c;难以做到统一 &#xff0c;文档数量激增&#xff0c;查找麻烦&#xff0c;知识的信息安全问题频发以及团队协作需求不断上升。同时&#xff0c;随着知识管理在企业运…

洞察插槽和 v-slot:组件插槽案例的分类解读

目录 插槽和v-slot介绍 组件插槽 默认插槽 具名插槽 条件插槽 动态插槽 作用域插槽 插槽和v-slot介绍 Vue插槽(Slot)是Vue.js框架中用于实现组件间内容传递和模板通信的一种机制。通过插槽,父组件可以向子组件的指定位置插入HTML结构或内容,从而实现更灵活和…

华为HCIP Datacom H12-821 卷31

1、PBR&#xff08;Policy-Based-Route&#xff09;可以执行以下哪些操作 A、修改匹配数据包的LSP B、修改匹配流量的下一跳地址 C、修改匹配流量的出接口 D、修改匹配流量的Qos信息 正确答案&#xff1a; A,B,C,D 解析&#xff1a;PBR可以设置本地路由策略动作&#x…

文章SameStr(二):图2代码

title: “Publication Figure 2” 百度云盘链接: https://pan.baidu.com/s/15g7caZp354zIWktpnWzWhQ 提取码: 4sh7 Libraries Standard Import library(tidyverse) library(cowplot) library(scales) library(ggpubr)Special library(lme4) library(sjPlot) library(sjst…

根据https链接点击按钮下载文件

filePreview(row) {fetch(row.attachmentContent.url).then(res >res.blob().then(blob > {var a document.createElement(a);var url window.URL.createObjectURL(blob);var name row.attachmentContent.name;a.href url;a.download name; // 下载名称a.click();wi…

数据仓库之命名规范

数据仓库命名规范旨在确保数据仓库中的各种对象&#xff08;如数据库、表、列、索引、视图等&#xff09;具有一致、清晰且有意义的名称。这些规范有助于提高数据的可读性、可维护性和可理解性。以下是一些常见的数据仓库命名规范&#xff0c;涵盖了数据库对象的各个方面。 一…

基于Java中的SSM框架实现学生网上请假系统项目【项目源码+论文说明】计算机毕业设计

摘要 本学生网上请假系统是针对目前学生网上请假系统的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的学生网上请假系统存在的问题进行分析&#xff0c;结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用目前最流…

大文件切片上传 So Easy?分享 1 段优质 JS 代码片段!

本内容首发于工粽号&#xff1a;程序员大澈&#xff0c;每日分享一段优质代码片段&#xff0c;欢迎关注和投稿&#xff01; 大家好&#xff0c;我是大澈&#xff01; 本文约 1100 字&#xff0c;整篇阅读约需 2 分钟。 大文件切片上传&#xff0c;我一般会分为4步来搞&#xf…

liosam编译问题

编译过程 因为lego安装时已经安装了gtsam因子图优化库,所以不需要再安装 直接编译即可 catkin_make -j8 报错实例 示例:[lio_sam_imuPreintegration-2] process has died,[lio_sam_mapOptmization-5] process has died 解决方法 实际问题是库文件libmetis.so 的位置。…