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

news2024/11/20 10:31:19

一个简单的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();
}

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

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

相关文章

【Google】关于Google Analytics埋点及API获取数据

本文是在实际操作中踩到的一些坑&#xff0c;并不是操作手册。具体的还是需要仔细按照官方文档操作。 参考文档&#xff1a;https://developers.google.com/analytics/ 重点看标红的文档即可 普通事件埋点 各端需要跟产品端确定好统一的事件名称和参数&#xff0c;否则数据混…

【机器学习】人工智能概述

人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使机器能够像人一样思考、学习和执行任务的学科。它是计算机科学的一个重要分支&#xff0c;涉及机器学习、自然语言处理、计算机视觉等多个领域。 人工智能的概念最早可以追溯到20世…

开源低代码开发平台如何在数字化转型中发挥价值?

当前&#xff0c;数字化转型升级是发展潮流&#xff0c;也是很多企业提升市场竞争力&#xff0c;获得更多利润价值的发展路径。作为提质增效的办公利器&#xff0c;开源低代码开发平台也将发挥应有的价值和作用&#xff0c;在推动企业数字化转型和流程化办公的过程中贡献力量&a…

【力扣题解】P589-N叉树的前序遍历-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P589-N叉树的前序遍历&#x1f30f;题目描述&#x1f4a1;题解&#x1f30f;总结 【力…

electron autoUpdater自动更新使用示例 客户端+服务端

封装好的 update.js 模块 use strict; const { autoUpdater } require(electron) // 更新检测 // https://www.electronjs.org/zh/docs/latest/api/auto-updaterconst checkUpdate (serverUrl) >{const updateUrl ${serverUrl}/update?platform${process.platform}&am…

【vue】avue-crud表单属性配置(表格以及列)

目录 前言1. 表格属性2. 列属性 前言 项目实战中需要调某个样式&#xff0c;但作为后端开发者也只能硬着头皮&#xff0c;此贴作为初学前端的第一帖&#xff0c;以下为学习笔记。 对应form属性文档可看这篇文章&#xff1a;form属性文档对应curd属性文档可看这篇文章&#xf…

tekton 发布 kubernetes 应用

tekton 发布 kubernetes 应用 基于Kubernetes 服务部署 Tekton Pipeline 实例&#xff0c;部署完成后使用tekton来完成源码拉取、应用打包、镜像推送和应用部署。 本文实现一个 golang-helloworld 项目 CI/CD 的完整流程&#xff0c;具体包括以下步骤&#xff1a; 从 gitee…

验证 Mixtral-8x7B-Instruct-v0.1 和 LangChain SQLDatabaseToolkit 的集成效果

验证 Mixtral-8x7B-Instruct-v0.1 和 LangChain SQLDatabaseToolkit 的集成效果 0. 背景1. 验证环境说明2. 验证开始2-1. 准备测试数据库2-2. 读取环境配置信息2-3. 导入依赖包2-3. 创建 SQLDatabaseToolkit 对象和 AgentExecutor 对象2-4. 第1个测试 - 描述一个表2-5. 第2个测…

关于Axios发送Get请求无法添加Content-Type

在拦截器中尝试给headers添加Content-Type&#xff1a; request.interceptors.request.use(config > {if (!config.headers[Content-Type]) {config.headers[Content-Type] application/json;}return config;},error > {return Promise.reject(error)} )如果是GET请求&…

【流复制环境PostgreSQL-14.1到PostgreSQL-16.1大版本升级】

PostgreSQL大版本会定期添加新特性&#xff0c;这些新特性通常会改变系统表的布局&#xff0c;但内部数据存储格式很少改变。pg_upgrade通过创建新的系统表和重用旧的用户数据文件来执行快速升级。 pg_upgrade升级主要有三种用法&#xff1a; 1、使用pg_upgrade拷贝升级。 2、…

Redis分布式缓存之主从哨兵分片集群

Redis主从 数据同步原理 Redis哨兵 Redis分片集群 集群伸缩&#xff1a;在集群中插入或删除某个节点 集群故障转移

使用ffmpeg实现视频旋转并保持清晰度不变

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg -i source.mp4 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-…

Java 基础学习(十九)网络编程、反射

1 Socket编程 1.1 Socket编程概述 1.1.1 Socket简介 在网络编程中&#xff0c;Socket&#xff08;套接字&#xff09;是一种抽象概念&#xff0c;它用于在不同计算机之间进行通信。Socket可以看作是一种通信的端点&#xff0c;可以通过Socket与其他计算机上的程序进行数据传…

亚马逊云科技 re:Invent 2023 产品体验:亚马逊云科技产品应用实践 国赛选手带你看 Elasticache Serverless

抛砖引玉 讲一下作者背景&#xff0c;曾经参加过国内世界技能大赛云计算的选拔&#xff0c;那么在竞赛中包含两类&#xff0c;一类是架构类竞赛&#xff0c;另一类就是 TroubleShooting 竞赛&#xff0c;对应的分别为亚马逊云科技 GameDay 和亚马逊云科技 Jam&#xff0c;想必…

Pytest框架 —— 用例标记和测试执行篇!

pytest用例标记和测试执行篇 上一篇文章入门篇咱们介绍了pytest的前后置方法和fixture机制&#xff0c;这个章节主要给大家介绍pytest中的标记机制和用例执行的方法。pytest可以通过标记将数据传入于测试函数中&#xff0c;也可以通过标记中对执行的用例做筛选&#xff0c;接下…

WebGL开发安全培训应用

使用 WebGL 开发安全培训应用可以为员工提供在虚拟环境中体验危险情境、学习安全操作和应急处理技能的机会。以下是开发安全培训应用的一般步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.明确…

Web(10)XSS漏洞

XSS跨站脚本攻击 XSS是什么 XSS(cross-site-scripting) 即是跨站脚本攻击&#xff0c;是一种网站应用程序的安全漏洞攻击&#xff0c;是代码注入的一种。它允许恶意用户将代码注入到网页上&#xff0c;其他用户在观看网页时就会受到影响。这类攻击通常包含了 HTML 以及用户端…

实战10 角色管理

目录 1、角色后端接口 2、角色列表查询 2.1 效果图 2.2页面原型代码 2.3 角色api代码 role.js 2.4 查询角色列表代码 4、 新增和编辑角色 5、删除角色 6、分配权限 6.1 分配权限思路 6.2 分配权限回显接口 6.3 分配权限回显前端实现 6.4分配权限后端接口 6.4.1 R…

实验八 基于FPGA的分频器的设计

基本任务一&#xff1a;设计一个分频器&#xff0c;输入信号50MHZ,输出信号频率分别为1KHZ&#xff0c;500HZ&#xff0c;1HZ。 m100&#xff1a; 扩展任务二&#xff1a;控制蜂鸣器发出滴滴滴的声音

补题与总结:leetcode第 377 场周赛

文章目录 写在最前面的复盘2977. 转换字符串的最小成本 II&#xff08;Flody 爆搜优化->dp&#xff09; 写在最前面的复盘 感谢leetcode&#xff0c;丰富了我为数不多的卡常经验 2是简单思维题&#xff0c;但卡常 4是爆搜优化&#xff0c;也卡常&#xff0c;补题时给卡麻了…