qt json tree 读取json树状结构并显示

news2024/11/15 18:06:22

1.介绍

用qt的相关的几个类处理json格式的信息

json内容:

{
"root":{
    "sites": [
    { "name":"菜鸟教程" , "url":"www.runoob.com" }, 
    { "name":"google" , "url":"www.google.com" }, 
    { "name":"微博" , "url":"www.weibo.com" }
    ]
}
}

显示效果:

2.代码

 jsontreewidget.h

#ifndef JSONTREEWIDGET_H
#define JSONTREEWIDGET_H

#include <QObject>
#include <QWidget>

#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonArray>

#include <QTreeWidget>
#include <QFile>
#include <QtDebug>


class JsonTreeWidget : public QTreeWidget
{
    Q_OBJECT

public:
    explicit JsonTreeWidget(QWidget *parent = Q_NULLPTR);
    void ReadFile(QString filPath); //读json文件用
    void ReadObj(QJsonObject rootJson, QTreeWidgetItem *treeItem);   //递归用

    void IntoValue(QJsonValue rootValue, QTreeWidgetItem *treeItem);
private:
    QTreeWidget * m_TreeWgt;
};

#endif // JSONTREEWIDGET_H

jsontreewidget.cpp

#include "jsontreewidget.h"

JsonTreeWidget::JsonTreeWidget(QWidget *parent):
    QTreeWidget(parent)
{
    m_TreeWgt = this;
}


void JsonTreeWidget::ReadFile(QString filPath)
{
    QFile file(filPath);
    if(!file.open(QIODevice::ReadOnly))  return;

    QByteArray allJson = file.readAll();//全部内容
    QJsonParseError jsonErr;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(allJson,&jsonErr));

    if(jsonErr.error != QJsonParseError::NoError)
    {
        qDebug()<<jsonErr.errorString();
        return ;
    }

    QJsonObject rootobj = jsonDoc.object();
    m_TreeWgt->clear();//清除旧的内容

    //新建顶层结点
    QTreeWidgetItem *top = new QTreeWidgetItem( m_TreeWgt->topLevelItem(0),QStringList (QString("top")) );
    m_TreeWgt->addTopLevelItem(top);

    //递归进去,直到rootobj是个empty object
    ReadObj(rootobj,m_TreeWgt->topLevelItem(0));

}

//第一层专用
void JsonTreeWidget::ReadObj(QJsonObject rootJson,QTreeWidgetItem* treeItem){

    QStringList li = rootJson.keys();//下一层的判断条件


    //不是叶子节点,继续层级递归
    for (int i=0; i < li.size();i++) {
        QJsonValue tempVal = rootJson.value(li.at((i)));

        QString str = li.at(i);
        QTreeWidgetItem *t = new QTreeWidgetItem;
        t->setText(0,str);
        treeItem->addChild(t);

        //递归进去
        IntoValue(tempVal,t);
    }

}



void JsonTreeWidget::IntoValue(QJsonValue rootValue,QTreeWidgetItem* treeItem){

    QStringList li = rootValue.toObject().keys();//下一层的判断条件

    //是叶子节点了
    if(li.isEmpty()){
        QString str;
        QJsonValue qj = rootValue;

        qDebug()<<qj.type();
        //是单个元素
        if(QJsonValue::String == qj.type()){
            str = qj.toString();
            QTreeWidgetItem *t = new QTreeWidgetItem;
            t->setText(0,str);
            treeItem->addChild(t);
        }
        //是数组元素,遍历
        else if(QJsonValue::Array == qj.type())
        {
            QJsonArray var = qj.toArray();
            for (int i=0;i<var.size();i++) {

                IntoValue(var.at(i) , treeItem);
            }
        }
        return;
    }

    //不是叶子节点,继续层级递归
    for (int i=0; i < li.size();i++) {
        QJsonValue tempVal = rootValue.toObject().value(li.at((i)));

        QString str = li.at(i);
        QTreeWidgetItem *t = new QTreeWidgetItem;
        t->setText(0,str);
        treeItem->addChild(t);

        //递归进去
        IntoValue(tempVal,t);
    }
}

3.使用方法

由于是继承QTreeWidget而创建的类,建议使用“提升为”功能

1.拉出一个 TreeWidget 

2.右键这个TreeWidget,点击“提升为”

 

3.在提升为对话框中在“提升的类名称”中输入这个类名(JsonTreeWidget)

点完“添加”,再点“提升”

 

这样在右侧边框中的类名就会改变为提升的类,ui指针也可以调这个类里的函数了。

 4.比如点击按钮,读取json文件并显示树状图

这是mainwindow.cpp,我只添加了一个头文集和一个按钮触发这个treeWidget的ReadFile函数。

“2.txt”里就是开头的json内容,放在与exe同级目录下即完成。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "jsontreewidget.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    ui->treeWidget->ReadFile("2.txt");
}

 

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

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

相关文章

QT环境的搭建安装:VsCode及Qt Creator

前言&#xff1a; vscode的界面美观&#xff0c;并且和QT一样的跨平台&#xff0c;所以可以选择vscode作为开发环境。   QT5.9.X版本成熟&#xff0c;相应教程丰富&#xff0c;并且5.9.9版本具有生成CMake功能&#xff0c;所以本文以QT5.9.9版本为例&#xff0c;给出QT环境的…

美团出品 | YOLOv6 v3.0 is coming(性能超越YOLOv7、v8)

&#x1f680;&#x1f680;&#x1f680;美团出品 | YOLOv6 v3.0 is coming &#xff01;&#xff01;✨✨✨ 一、前言简介 &#x1f384;&#x1f388; &#x1f4da; 代码地址&#xff1a;美团出品 | YOLOv6 3.0代码下载地址 &#x1f4da; 文章地址&#xff1a;https://a…

仿写Dubbo-Java反射

概念 反射是Java的一个特性&#xff0c;反射允许程序运行时动态获取类的所有信息以及对其进行操作。反射在框架(spring&#xff0c;springboot&#xff0c;mybatis等)中的使用非常的广发&#xff0c;可谓是框架的灵魂。 获取Class对象 在使用反射之前&#xff0c;需要获取到Cla…

工欲善其事必先利其器——Elasticsearch安装

安装使用说明 首先在elasticsearch官网下载你想要安装的版本&#xff0c;我这里使用的是7.12.1版本 上传到你想要安装的目录&#xff08;/user/search/&#xff09; 然后解压&#xff0c;解压命令如下&#xff1a; tar -zxvf elasticsearch-7.12.1-linux-x86_64.tar.gz 解压后…

创建保存字符串的数组numpy.char以及用于处理字符串数组的函数

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】创建字符串数组numpy.char.array()修改字符串数组大小写capitalize()&#xff1b;title()&#xff1b;lower()&#xff1b;upper()[太阳]选择题对于以下python代码title()方法输出的结果是?imp…

【并发编程十二】c++20线程同步——信号量(semaphore)

【并发编程十二】c20线程同步——信号量&#xff08;semaphore&#xff09;一、互斥二、条件变量三、future四、信号量1、信号量原理2、c 20 信号量3、demo简介&#xff1a; 本篇文章&#xff0c;是线程同步的最后一篇。我们详细的介绍下c标准库提供的线程同步方法——信号量&a…

嵌入式Linux-线程创建与终止

1. 线程的创建 1.1 创建线程 启动程序时&#xff0c;创建的进程只是一个单线程的进程&#xff0c;称之为初始线程或主线程&#xff0c;本小节我们讨论如何创建一个新的线程。 创建线程与创建进程的方法是一样的&#xff0c;让我们来看一下创建线程的函数&#xff1a; #incl…

Linux基本功系列之chown命令实战

文章目录一. 前言&#x1f680;&#x1f680;&#x1f680;二. chown命令介绍三. 语法格式及常用选项四. 参考案例3.1 改变指定文件的属组和属主3.2 改变指定文件的所属主与所属组&#xff0c;并显示过程3.3 改变指定目录及其内所有子文件的所属主与所属组3.4 只修改文件所属组…

P问题、NP问题、NP-Complete问题、NP-Hard问题分别代表什么含义?

绪论 在了解P、NP、NP-Complete、NP-Hard问题之前,先感性地感受一下这几个问题之间的区别和联系👇: 上图分为左右两个版本,推荐记住左边的比较通用。这是因为NP=P这个数学问题曾经被列为7大数学难题之一,而且是之首,甚至美国还悬赏100W美金,但是比较认可的结果是暂时…

Python数据可视化之条形图和热力图

Python数据可视化之条形图和热力图 提示&#xff1a;介绍 简单介绍Pthon可视化的图表使用 提示&#xff1a;热力图和条形图 文章目录Python数据可视化之条形图和热力图前言一、导入数据包二、选择数据集2.加载数据2.读入数据总结前言 提示&#xff1a;这里可以添加本文要记录的…

Acwing 1010. 拦截导弹

Acwing 1010. 拦截导弹一、问题描述二、算法分析三、代码实现一、问题描述 二、算法分析 这道题共分为两问&#xff0c;我们先看第一问。 该问的背后是一个很经典的最长单调子序列模型。 在这个模型中&#xff0c;我们的状态f[i]f[i]f[i]的定义是&#xff0c;以第iii个元素为结…

Cert Manager 申请SSL证书流程及相关概念-三

中英文对照表 英文英文 - K8S CRD中文备注certificatesCertificate证书certificates.cert-manager.io/v1certificate issuersIssuer证书颁发者issuers.cert-manager.ioClusterIssuer集群证书颁发者clusterissuers.cert-manager.iocertificate requestCertificateRequest证书申…

50个你离不开的 CLI 工具

作为开发人员&#xff0c;我们在终端上花费了大量时间。有很多有用的 CLI 工具&#xff0c;它们可以让您在命令行中的生活更轻松、更快速&#xff0c;而且通常更有趣。这篇文章概述了我最依赖的 50 个必备 CLI 工具。如果我遗漏了什么 - 请在评论中告诉我 :)在本文的结尾&#…

二叉树专题汇总

二叉树的前中后序遍历day11|144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历_奈川直子的博客-CSDN博客二叉树的层序遍历、翻转二叉树、对称二叉树day12|层序遍历合集、226.翻转二叉树、101.对称二叉树_奈川直子的博客-CSDN博客N叉树最大深度、完全二叉树节点…

LCHub:2023年无代码、低代码8大技术趋势

在数字化转型、新冠疫情、全球经济环境动荡等多因素驱动下,使得组织改变了对低代码、无代码的看法,市场规模和场景化落地实现快速增长。根据Gartner预测,到2025年,70%的应用程序将由低代码和无代码开发平台构建,其中 80%的应用程序由非IT工作者开发而成。 没有编程背景的…

青山不语,碧海无痕,数字山河间的中国脊梁

刚刚过去的2022&#xff0c;对于新农人来说&#xff0c;是不寻常的一年。福建宁德的渔民祖祖辈辈都以外出打鱼为生&#xff0c;渔排生活条件艰苦&#xff0c;娱乐匮乏&#xff0c;销路也不稳定&#xff0c;这种苦闷正随着AI、直播等数字新技术的到来而被消解。青海列卜加村的孙…

Arduino的nodemcu 8266开发板使用MicroPython开发的整体流程

程序安装准备 安装开发板驱动&#xff0c;官网&#xff1a;&#xff08;https://cn.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tabdownloads&#xff09;这里不是CH340驱动&#xff0c;而是CP210x USB to USART 驱动&#xff0c;最终也是在“设备管理器查看COM口…

【LeetCode:33. 搜索旋转排序数组~~~二分】

题目描述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…

操作系统真相还原_第5章第1节:利用BIOS中断0x15 获取内存信息

文章目录功能号返回信息功能号详解子功能号&#xff1a;0xE820子功能号&#xff1a;0xE801子功能号&#xff1a;0x88内存检测示例当前内存分布说明程序boot.incmbr.sloader.s编译并写入硬盘启动bochs运行功能号 EAX0xE820&#xff1a;遍历主机上全部内存 AX0xE801&#xff1a;…

分享121个ASP源码,总有一款适合您

ASP源码 分享121个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 121个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1wwsIoZidHihm5WHPKjlvMg?pwdew3b 提取码&#x…