treeview数据的保存和读取(以表格方式保存)

一个简单的treeivew,以表格方式保存比较简单,遍历所有节点,记录parentNode、node、data即可

parentiddataid
002xx2001
005xx5000
003xx3001
006xx6002
007xx7001
000xx0001
001xx1-1
004xx4007

如何将表格转为tree数据,代码如下:

#include "mainwindow.h"
#include <QtWidgets>

struct DataInfo{
    QString id;
    QString name;
    QString parentId;
};
struct DataNode{
    DataInfo info;
    QMap<QString, DataNode> child;
};

void print(QMap<QString, DataNode> map)
{
    for(auto d = map.begin(); d != map.end(); d ++) {
        auto k = d.value();
        qDebug() << __LINE__ << d.key() << k.info.name;
        print(k.child);
    }
}
void fillTree(QMap<QString, DataNode> map, QStandardItem *item)
{
    for(auto k = map.begin(); k != map.end(); k ++) {
        DataNode d = k.value();
        QStandardItem *itm = new QStandardItem;
        itm->setText(d.info.name);
        item->appendRow(itm);
        fillTree(d.child, itm);
    }
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QList<DataInfo> infoList;
    infoList << DataInfo{"002", "xx2", "001"};
    infoList << DataInfo{"005", "xx5", "000"};
    infoList << DataInfo{"003", "xx3", "001"};
    infoList << DataInfo{"006", "xx6", "002"};
    infoList << DataInfo{"007", "xx7", "001"};
    infoList << DataInfo{"000", "xx0", "001"};
    infoList << DataInfo{"001", "xx1", "-1"};
    infoList << DataInfo{"004", "xx4", "007"};
    //生成树状图
    QMap<QString, DataNode> dataMap;
    QMap<QString, DataNode*> ptrMap;
    for(auto d : infoList) {
        //父节点存在 并且 子节点存在
        if(ptrMap.contains(d.parentId) && ptrMap.contains(d.id)) {
            ptrMap[d.id]->info = d;
            ptrMap[d.parentId]->child[d.id] = dataMap.take(d.id);
            ptrMap.insert(d.id, &ptrMap[d.parentId]->child[d.id]);
            continue;
        }
        //父节点存在 并且 子节点不存在
        if(ptrMap.contains(d.parentId)) {
            ptrMap[d.parentId]->child[d.id].info = d;
            ptrMap.insert(d.id, &ptrMap[d.parentId]->child[d.id]);
            continue;
        }
        //父节点不存在 并且 子节点存在
        if(ptrMap.contains(d.id)) {
            ptrMap[d.id]->info = d;
            dataMap[d.parentId].child[d.id] = dataMap.take(d.id);
            ptrMap.insert(d.parentId, &dataMap[d.parentId]);
            continue;
        }
        //父节点不存在 并且 子节点不存在
        dataMap[d.parentId].child[d.id].info = d;
        ptrMap.insert(d.parentId, &dataMap[d.parentId]);
        ptrMap.insert(d.id, &dataMap[d.parentId].child[d.id]);
    }

    QTreeView view;
    QStandardItemModel *model = new QStandardItemModel;
    view.setModel(model);
    view.header()->hide();
    auto root = model->invisibleRootItem();
    root->appendRow(new QStandardItem("root"));
    root = root->child(0);

    print(dataMap);
    fillTree(dataMap, root);
    view.expandAll();
    view.show();

    return a.exec();
}

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

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

相关文章

centos7 安装最新版jenkins; 安装jdk17 jenkins; 2024安装最新版jenkins; jenkins部署服务器启动失败

注意&#xff1a; java, maven配置&#xff0c;不再赘述&#xff0c;主要解决&#xff1a;配置端口&#xff0c;启动失败&#xff0c;问题 提供一个jdk下载网站&#xff1a; https://www.injdk.cn/ /etc/profile配置&#xff1a; MAVEN_HOME/home/maven export PATH$MAVEN_HO…

设置视图的对齐方式

对齐方式 在XML文件中通过属性android:layout_gravity可以指定当前视图的对齐方向&#xff0c;当属性值为top时表示视图朝上对齐&#xff0c;为bottom时表示视图朝下对齐&#xff0c;为left时表示视图靠左对齐&#xff0c;为right时表示视图靠右对齐。如果希望视图既朝上又靠左…

分页合理化是什么?

一、前言 只要是干过后台系统的同学应该都做过分页查询吧&#xff0c;前端发送带有页码&#xff08;pageNum&#xff09;和每页显示数量&#xff08;pageSize&#xff09;的请求&#xff0c;后端根据这些参数来提取并返回相应的数据集。在SpringBoot框架中&#xff0c;经常会使…

docker安装入门及redis,minio,rabbitmq应用安装

部分笔记来自黑马课堂&#xff1a;【黑马程序员Docker快速入门到项目部署&#xff0c;MySQL部署Nginx部署docker自定义镜像DockerCompose项目实战一套搞定-哔哩哔哩】 https://b23.tv/niWEhEF 一、什么是docker&#xff1a; 快速构建、运行、管理应用的工具。--帮助我们快速部…

HarmonyOS应用抓包实战

Charles抓包原理 Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器&#xff0c;当浏览器连接Charles的代理访问互联网时&#xff0c;Charles可以监控浏览器发送和接收的所有数据。 在开发OpenHarmony/HarmonyOS应用开发时&#xff0c;我们使用的是ohos/axios来进行网络…

VSCode注释

一、设置 1. 安装 “KoroFileHeader” 插件 2. 编辑 setting.json 文件 在设置页面中&#xff0c;使用搜索框输入 “fileheader”&#xff0c;然后点击 “在 setting.json 中编辑”。 3. 添加设置项到 setting.json // 函数 "fileheader.cursorMode": {"de…

【六】【C语言\动态规划】买卖股票的最佳时机含手续费、买卖股票的最佳时机 III、买卖股票的最佳时机 IV,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

怎么快速采集京东、淘宝天猫、1688、拼多多等百家电商产品图片和视频

作为新时代电商&#xff0c;主图和视频素材尤为关键&#xff0c;有好的主图才能更加的吸引客户点击&#xff0c;促进成交量。但是现在很多商家直接制作的主图都很难有预期效果&#xff0c;自己拍摄的图片暗沉&#xff0c;没有光鲜亮丽的突出性。所以现在很多人都是在采集同类商…

Unity中Shader裁剪空间推导(正交相机到裁剪空间的转化矩阵)

文章目录 前言一、正交相机 转化到 裁剪空间 干了什么1、正交相机裁剪的范围主要是这个方盒子2、裁剪了之后&#xff0c;需要把裁剪范围内的坐标值化到[-1,1]之间&#xff0c;这就是我们的裁剪空间。3、在Unity中&#xff0c;设置相机为正交相机4、在这里设置相机的近裁剪面和远…

Python 雨花 - 前言

众多技术教程的个人网站 https://wukongnotnull.com/ 目录 ⛳️ 教程介绍&#x1f3af; 前置要求⚽️ 学习交流群&#x1f9ed; 教学文档配套视频&#x1f94e; 一对一 VIP答疑辅导&#x1f4a1; 参考文献 ⛳️ 教程介绍 Python 入门教程&#xff0c;通俗易懂&#xff0c;快速…

手滑误删备忘录?这样做手滑误删也能恢复

在这个快节奏的时代&#xff0c;备忘录几乎成了我日常生活的救命稻草。匆忙间&#xff0c;我时常依赖它记录那些一闪而过的灵感或是重要的待办事项。但你有没有过这样的经历&#xff1f;在滑动屏幕的一瞬间&#xff0c;一个不小心&#xff0c;重要的备忘录就这么消失了&#xf…

springboot+vue项目如何在linux上部署

在linux上部署项目&#xff0c;是我们实训项目作业的最后一步&#xff0c;此时我们的项目编码测试已经完成&#xff0c;接下来就需要在服务器上部署上线&#xff0c;那么如何部署上线&#xff0c;接下来我会在虚拟机上的CentOS7系统上实现部署&#xff0c; 一.下载JDK 因为我…

如何搭建一个高效的Python开发环境

“工欲善其事&#xff0c;必先利其器”&#xff0c;这里我们来搭建一套高效的 Python 开发环境&#xff0c;为后续的数据分析做准备。 关于高效作业&#xff0c;对于需要编写 Python 代码进行数据分析的工作而言&#xff0c;主要涉及两个方面。 1. 一款具备强大的自动完成和错…

c语言:计算阶乘的和|练习题

一、题目 输入一个数n&#xff0c;计算1&#xff01;2&#xff01;……n&#xff01;的和 如图&#xff1a; 二、思路分析 设置两个函数 1、一个函数求阶乘 2、一个函数求多个数相加的总和 3、把求阶乘的函数&#xff0c;嵌套在求相加总和的函数里面 三、代码截图【带注释】 四…

highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动

效果图&#xff1a;最左侧的分类列是跟随甘特图滚动的&#xff0c;因为这一列如果需要自定义&#xff0c;比如表格的话可能会存在行合并的情况&#xff0c;这个时候甘特图是没有办法做的&#xff0c;然后甘特图的表头又需要做滚动时固定&#xff0c;所以设置了甘特图滚动时&…

【代码混淆】react-native 代码混淆

​ 使用react native开发app&#xff0c;实现代码混淆的操作。 无论是加密还是运行时虚拟机&#xff0c;最后都可以通过执行时调试把代码反向生成出来原来的代码&#xff0c;虽然能抵御低端的黑客攻击&#xff0c;但是对高端黑客却形同虚设。 代码混淆是通过修改源代码结构和变…

【习题】运行Hello World工程

判断题 1. DevEco Studio是开发HarmonyOS应用的一站式集成开发环境。 正确(True)错误(False) 正确(True) 2. main_pages.json存放页面page路径配置信息。 正确(True)错误(False) 正确(True) 单选题 1. 在stage模型中&#xff0c;下列配置文件属于AppScope文件夹的是&am…

视频专访 | 每日互动刘宇:AI不止GC,更有TA

当前&#xff0c;“百模大战”已进入拼落地、拼应用的下半场&#xff0c;给千行百业带来了降本增效的巨大机遇。聚焦到品牌营销领域&#xff0c;大模型给行业带来了哪些改变&#xff1f;企业如何利用大模型优化数字化营销手段、提升数字化营销效果&#xff0c;最终驱动品牌实现…

嵌入式——I2C原理代码结合(干货)看图易懂

学习目标 理解I2C通讯原理理解I2C通讯过程中的信号理解软件I2C实现过程理解硬件I2C的工作内容学习内容 I2C通讯规则 I2C总线包括两根信号线:SDA(串行数据线)和SCL(串行时钟线)。这两根信号线共用一个总线,因此在总线上可以连接多个设备。在I2C总线上,每个设备都有一个唯…

微服务注册与发现——Eureka

文章目录 Eureka使用引用配置启动类标记访问微服务注册微服务工程添加引用增加配置启动类增加注解启动服务注册 Eureka Server集群部署修改配置文件启动多个eureka实例微服务注册到多个eureka实例 为Eureka Server添加用户认证引入spring-security配置关闭security的csrf&#…