Qt中的QTreeWidget父节点与子节点的遍历(递归和栈,JSON文件)

  1. JSON文件的解析

                []中括号代表的是一个数组;

                {}大括号代表的是一个对象;

                双引号“ ”表示的是属性值;

                冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可                   以是基本数据类型,也可以是引用数据类型。

  1. 打开文件
  2. 解析出一个QJsonObject对象
  3. 利用这个对象进行嵌套解析取出变量

头文件

QStack<QTreeWidgetItem*> stack;

private:
    QTreeWidget *treeWidget;
    QTreeWidgetItem *treeWidgetItem_Block;
    QTreeWidgetItem *treeWidgetItem_Product;
    QString blockalia_Block;
    QString blockalia_Product;
treeWidget=new QTreeWidget(this);
    //读出文件相对路径
    //相对路径就是exe目录下去找到文件的位置
    //Qt获取exe文件目录的方法(QCoreAPPlication::application())
    QString json_file_path("");
    //根据路径获取文件的内容
    QFile json_file(json_file_path);
    json_file.open(QIODevice::ReadOnly);
    if(!json_file.isOpen())
    {
        qInfo()<<"Open File error!";
    }
    QTextCodec* text_code=QTextCodec::codecForName("UTF-8");
    QString raw_json=json_file.readAll();
    QJsonParseError parse_error;

    //解析出一个json文件对象
    QJsonObject block_json=QJsonDocument::fromJson(raw_json.toUtf8(),&parse_error).object();
    //通过这个JSON文件取出其他数据
    //数组类型的
    QJsonArray pagesArray_=block_json["pages"].toArray();
    for(int i=0;i<pagesArray_.size();i++){
        QJsonValue page=pagesArray_.at(i);
        //将page转变为QJsonObject,可以进一步从中取出对象
        QJsonObject pages_Obj=page.toObject();
        //在将pages转变为QJsonObject类型之后可以嵌套循环遍历出自己想要拿到的数据
        QJsonArray graphArray_=pages_Obj["graphObjects"].toArray();
        for(int j=0;j<graphArray_.size();j++){
            //接着进行解析直到取出想要的数据
            QJsonValue grapObject_=graphArray_.at(j);
            QJsonObject graph_Obj=grapObject_.toObject();
            QString what=graph_Obj["what"].toString();
            //父节点的遍历
            //再次递归是就是父节点下子节点的遍历
            QString blockalia_Block=graph_Obj["blockalias"].toString();
            if(what=="Block"){
                if(!stack.empty()){
                    treeWidgetItem_Block=stack.top();
                    treeWidgetItem_Product=new QTreeWidgetItem(treeWidgetItem_Block);
                    treeWidgetItem_Product->setText(0,blockalia_Block);
                }
                //satck现在是空的 所以将blockalia_Block赋值到父节点上
                //serialzationjson(filePath,fileName)之后 stack里面有值了进行if的操作
                //就是把子节点赋值到树上去
                else {
                    treeWidgetItem_Block=new QTreeWidgetItem(treeWidget);
                    treeWidgetItem_Block->setText(0,blockalia_Block);
                }
            }
            else if(what=="Product"){
                blockalia_Product=graph_Obj["blockalias"].toString();
                qInfo()<<"blockalia_Product"<<blockalia_Product;
                QString filePath=graph_Obj["filePath"].toString();
                QString fileName=graph_Obj["fileName"].toString();
                if(!stack.empty()){
                    treeWidgetItem_Block=stack.top();
                    treeWidgetItem_Product=new QTreeWidgetItem(treeWidgetItem_Block);
                    treeWidgetItem_Product->setText(0,blockalia_Block);
                    stack.push(treeWidgetItem_Product);
                }
                else {
                    treeWidgetItem_Block=new QTreeWidgetItem(treeWidget);
                    treeWidgetItem_Block->setText(0,blockalia_Block);
                    stack.push(treeWidgetItem_Block);
                }
                serialzationjson(filePath,fileName);
                //一个父节点的所有子节点全部赋值完之后就可以弹出
                //这样就可以一个一个父节点进行遍历赋值
                stack.pop();
            }
          }

        }
    //递归
    //将上述步骤定义一个函数serialzationjson(filePath,fileName)
    //根据函数传入的path和name 再一次进行以上的操作
    //可以循环去遍历出需要的节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值