Qt 解析JSON数据利用Tree Widget生成资源树
JSON类及其作用
Json 类 | 介绍 |
---|---|
QJsonDocument | 它封装了一个完整的 JSON 文档,并且可以从 UTF-8 编码的基于文本的表示以及 Qt 自己的二进制格式读取和写入该文档。 |
QJsonArray | JSON 数组是一个值列表。可以通过从数组中插入和删除 QJsonValue 来操作该列表。 |
QJsonObject | JSON 对象是键值对的列表,其中键是唯一的字符串,值由 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;
}
}