【Qt 解析JSON数据利用Tree Widget生成资源树】

Qt 解析JSON数据利用Tree Widget生成资源树

JSON类及其作用

Json 类介绍
QJsonDocument它封装了一个完整的 JSON 文档,并且可以从 UTF-8 编码的基于文本的表示以及 Qt 自己的二进制格式读取和写入该文档
QJsonArrayJSON 数组是一个值列表。可以通过从数组中插入和删除 QJsonValue 来操作该列表。
QJsonObjectJSON 对象是键值对的列表,其中键是唯一的字符串,值由 QJsonValue 表示。
QJsonValue该类封装了 JSON 支持的数据类型。

QJsonDocument的作用:上文知 JSON一共有两种格式,即 JSON数组JSON对象**,它们最终要利用JSON完成序列化,将数据转换为对应的字符串,或者有另外一种情况是字符串转换为JSON数组和JSON对象。QJsonDocument就起到了转换器的作用,是转换的纽带。
QJsonArray的作用: 封装了Json里的数组。
QJsonObject的作用: 封装了Json里的对象。
QJsonValue的作用: 是对前面调到的数据类型的包装,C++中针对不同的数据类型有不同的声明,QJsonValue类是利用构造函数将各种数据类型进行了统一化,包装成一种类型,操作更为简单。

QTreeWidget常用接口

1.添加顶层节点

    //添加顶层节点
    QTreeWidgetItem *topItem1 = new QTreeWidgetItem(ui->treeWidget);
    topItem1->setText(0,"百度");
    ui->treeWidget->addTopLevelItem(topItem1);

2.设置表头隐藏,展开所有项

    //隐藏表头
    ui->treeWidget->setHeaderHidden(true);
    //设置展开
    ui->treeWidget->expandAll();

3.顶层节点添加子节点

    QTreeWidgetItem *item11 = new QTreeWidgetItem(topItem1);
    item11->setText(0,"研发部");
    QTreeWidgetItem *item12 = new QTreeWidgetItem(topItem1);
    item12->setText(0,"销售部");
    QTreeWidgetItem *item13 = new QTreeWidgetItem(topItem1);
    item13->setText(0,"人事部");

4.节点可以带一些数据,使用setData()这个接口

    //设置数据,可以带多种数据
    item11->setData(0,Qt::UserRole,100/*人员数量*/);
    item11->setData(0,Qt::UserRole+1,"李彦宏"/*负责人名字*/);
    //获得数据
    item11->data(0,Qt::UserRole).toInt();
    item11->data(0,Qt::UserRole+1).toString();

5.节点可以设置自定义类型,设置图标、flags、文本

//自定义枚举
enum NodeType
{
    ROOT = 0,
    SON 
};
QTreeWidgetItem *item = new QTreeWidgetItem(ROOT);
//item->setIcon();
//item->setText();
//item->setFlags();

6.设置带checkBox

    QTreeWidgetItem *topItem2 = new QTreeWidgetItem(ui->treeWidget);
    topItem2->setText(0,"腾讯");
    topItem2->setCheckState(0,Qt::Checked);
    ui->treeWidget->addTopLevelItem(topItem2);
    QTreeWidgetItem *item21 = new QTreeWidgetItem(topItem2);
    item21->setText(0,"研发部");
    item21->setCheckState(0,Qt::Checked);
    QTreeWidgetItem *item22 = new QTreeWidgetItem(topItem2);
    item22->setText(0,"销售部");
    item22->setCheckState(0,Qt::Checked);
    QTreeWidgetItem *item23 = new QTreeWidgetItem(topItem2);
    item23->setText(0,"人事部");
    item23->setCheckState(0,Qt::Checked);

简单的响应一下点击信号,当顶层节点选中,下面的所有子节点全选中

    connect(ui->treeWidget,&QTreeWidget::itemClicked,this,
            &Form::slotClicked);
    void Form::slotClicked(QTreeWidgetItem *item, int column)
    {
        //简单响应一下选中状态槽函数
        for (int i=0; i<item->childCount(); i++)
        {
           QTreeWidgetItem *pChildItem = item->child(i);
           pChildItem->setCheckState(0,item->checkState(0));
        }
    }

7.右键菜单

    //打开右键菜单属性
    ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    //右键菜单
    m_menu = new QMenu(ui->treeWidget);
    m_menu->addAction("添加");
    m_menu->addAction("删除");
    //响应右键菜单信号槽
    connect(ui->treeWidget,&QTreeWidget::customContextMenuRequested,
            this,&Form::slotMenuPopup);
    void Form::slotMenuPopup(const QPoint &pos)
    {
        m_menu->exec(ui->treeWidget->mapToGlobal(pos));
    }

代码实现解析JSON数据利用Tree Widget生成资源树:

void on_refreashButton_clicked()
{
    ui->treeWidget->clear();//清空树
    name = "";//清空名字
    classid1 = "";//清空id号
    QJsonDocument document;//新建Json文件对象
    QByteArray dataArray = document.toJson(QJsonDocument::Compact);
    qDebug()<<dataArray;
    QTreeWidgetItem *fileTopItem1 = new QTreeWidgetItem(ui->treeWidget);//创建新的树结点
    fileTopItem1->setText(0,QString("资源树"));//设置结点名字
    updatSourceTree(classid1,treeNode1);//调用更新资源树函数
}
void updatSourceTree(QString &classid, QTreeWidgetItem *treeNode)
{
    QNetworkRequest request;//网络请求
    request.setUrl(QUrl(Httppath+QString("/getResourceClass?classId=")+classid));
    request.setHeader(QNetworkRequest::ContentTypeHeader,"/json;charset=UTF-8");
    QNetworkAccessManager manager;
    QNetworkReply *reply = manager.get(request);
    QEventLoop loop;
    connect(reply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
    loop.exec();
    qDebug()<<reply->error();
    QByteArray replyData = reply->readAll();
    QJsonParseError json_error;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData,&json_error));//获取请求到的json文件
    if(json_error.error != QJsonParseError::NoError){
        qDebug()<<json_error.error;
        return;
    }
    QJsonObject rootObj = jsonDoc.object();
    QJsonValue row = rootObj.value(QStringLiteral("rows"));
    QJsonArray rowArray = row.toArray();//得到json数据,封装成数组形式
    for(int i = 0; i<rowArray.size();i++)//循环遍历json数组
    {
        name = rowArray.at(i).toObject()["name"].toString();//得到名字
        processOid = rowArray.at(i).toObject()["classid"].toString();//得到id号

        //创建依附于treeNode的结点
        QTreeWidgetItem *processData = new QTreeWidgetItem(treeNode);
        if(childItem_flag == 0)//判断是否进入了子结点(二级及以上树),0表示在顶层(一级树)
        {
            ui->treeWidget->addTopLevelItem(treeNode);//设treeNode为顶层结点
            processData->setText(0,name);//结点中插入名字和id号
            processData->setText(1,classid);
            updatSourceTree(processOid,processData);//继续再递归,寻找下一级树的信息
        }
        else {//
            //创建依附于processData结点的子结点
            QTreeWidgetItem *childItem(new QTreeWidgetItem(processData));
            childItem->setText(0,name);//插入数据
            processData->setText(1,classid);
            if(classid != NULL)//如果id不为空,则说明还存在下一级树
            {
                childItem_flag = 1;//子结点标志变为1
                updatSourceTree(processOid,fileTopItem);继续再递归,寻找下一级树的信息
            }
            else {//如果id为空,则说明没有下一级树
                return;
            }
        }
        childItem_flag = 0;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唯时

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值