json數據可保存小量的數據在本地的json文件中。QT有兩種方式操作:(1).cJSON (2).QT的操作json數據的類。
應用:將監控預案數據保存在本地中。
1.首先根據預案結構創建一個json格式的數據框架:
2.將監控預案樹轉化成json數據,再保存為json文件。
void VideoPreview::setPlanTreeDataToJsonFile() { //將m_pPlanTree預案數據轉化成json數據寫入文件 cJSON* pData = cJSON_CreateArray(); int count = m_pPlanTree->topLevelItemCount(); for (int i = 0; i < count; i++) { cJSON* pObject = cJSON_CreateObject(); cJSON_AddItemToArray(pData, pObject); QTreeWidgetItem* pTopItem = m_pPlanTree->topLevelItem(i); QString text = pTopItem->text(0); cJSON_AddItemToObject(pObject, "name", cJSON_CreateString(text.toStdString().c_str())); cJSON* pDataArray = cJSON_AddArrayToObject(pObject, "data"); int topChildCount = pTopItem->childCount(); for (int j = 0; j < topChildCount; j++) { int childCount = pTopItem->child(j)->childCount(); for (int k = 0; k < childCount; k++) { int childChildCount = pTopItem->child(j)->child(k)->childCount(); for (int n = 0; n < childChildCount; n++) { QTreeWidgetItem* pChildChildItem = pTopItem->child(j)->child(k)->child(n); QVariant var = pChildChildItem->data(0, Qt::UserRole); VIDEO_CHANNEL vc = var.value<VIDEO_CHANNEL>(); VIDEO_DEVICE chData = vc.device; cJSON* pObj = chData.covertToJson(); cJSON_AddItemToArray(pDataArray, pObj); } } } } //寫入到文件(覆蓋) writePreviePlan(pData); }
void VideoPreview::writePreviePlan(cJSON * data) { QString filePath = QApplication::applicationDirPath() + "/previewPlanConfig.json"; QFile file(filePath); bool bRet = file.open(QIODevice::WriteOnly | QIODevice::Text); if (bRet) { file.write(cJSON_PrintUnformatted(data)); } }
3.當監控預案樹初始化時:
void VideoPreview::reloadPreviePlan() //重新從json文件中加載預案數據到m_pPlanTree { m_pPlanTree->clear(); cJSON* pData = readPreviewPlan(); QString str = cJSON_Print(pData); if (pData) { int size = cJSON_GetArraySize(pData); for (int i = 0; i < size; i++) { cJSON* pArray = cJSON_GetArrayItem(pData, i); cJSON* pName = cJSON_GetObjectItem(pArray, "name"); //預案名稱 QString planName = cJSON_Print(pName); planName = planName.replace("\"", ""); //添加頂層節點 QTreeWidgetItem* pRootPlanItem = new QTreeWidgetItem(m_pPlanTree, QStringList() << planName); pRootPlanItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable); //設置可編輯 pRootPlanItem->setData(0, Qt::UserRole + 1, QVariant(TREE_ITEM_TYPE::TREE_PLAN_ROOT)); pRootPlanItem->setIcon(0, QIcon(":/Images/Resources/video_plan.png")); m_pPlanTree->addTopLevelItem(pRootPlanItem); //添加頂層節點 //在根節點下添加數據 cJSON* p_Data = cJSON_GetObjectItem(pArray, "data"); //數據 int dataSize = cJSON_GetArraySize(p_Data); for (int i = 0; i < dataSize; i++) { cJSON* item = cJSON_GetArrayItem(p_Data, i); VIDEO_DEVICE chData(item); //將視頻監控按名稱->地點->位置分類 if (pRootPlanItem->childCount() == 0) { createChildItem(pRootPlanItem, chData, i, TREE_ITEM_TYPE::TREE_VIDEO_NAME); createChildItem(pRootPlanItem->child(0), chData, i, TREE_ITEM_TYPE::TREE_VIDEO_ADDR); createChildItem(pRootPlanItem->child(0)->child(0), chData, i, TREE_ITEM_TYPE::TREE_PLAN_CHANNEL); continue; } for (int j = 0; j < pRootPlanItem->childCount(); j++) //湖南省 { QTreeWidgetItem* nameItem = pRootPlanItem->child(j); if (chData.name == nameItem->text(0)) { if (nameItem->childCount() == 0) { createChildItem(nameItem, chData, i, TREE_ITEM_TYPE::TREE_VIDEO_ADDR); } for (int k = 0; k < nameItem->childCount(); k++) //衡陽市 { QTreeWidgetItem* addrItem = nameItem->child(k); if (chData.addr == addrItem->text(0)) { for (int n = 0; n < addrItem->childCount(); n++) //衡東縣 { QTreeWidgetItem* locationItem = addrItem->child(n); if (chData.location == locationItem->text(0)) { //相同的預案則不重復添加 break; } else { if (n < addrItem->childCount() - 1) continue; } //所有級都沒有相同的則創建一個並保存返回 createChildItem(addrItem, chData, i, TREE_ITEM_TYPE::TREE_PLAN_CHANNEL); break; } break; } else { if (k < nameItem->childCount() - 1) continue; } createChildItem(nameItem, chData, i, TREE_ITEM_TYPE::TREE_VIDEO_ADDR); createChildItem(nameItem->child(k + 1), chData, i, TREE_ITEM_TYPE::TREE_PLAN_CHANNEL); break; } break; } else { if (j < pRootPlanItem->childCount() - 1) continue; } createChildItem(pRootPlanItem, chData, i, TREE_ITEM_TYPE::TREE_VIDEO_NAME); createChildItem(pRootPlanItem->child(j + 1), chData, i, TREE_ITEM_TYPE::TREE_VIDEO_ADDR); createChildItem(pRootPlanItem->child(j + 1)->child(0), chData, i, TREE_ITEM_TYPE::TREE_PLAN_CHANNEL); break; } } } } } void VideoPreview::createChildItem(QTreeWidgetItem *parent, VIDEO_DEVICE data, int channel, TREE_ITEM_TYPE type) { QString text; if (type == TREE_ITEM_TYPE::TREE_VIDEO_NAME) { text = data.name; } else if (type == TREE_ITEM_TYPE::TREE_VIDEO_ADDR) { text = data.addr; } else if (type == TREE_ITEM_TYPE::TREE_VIDEO_CHANNEL || type == TREE_ITEM_TYPE::TREE_PLAN_CHANNEL) { text = data.location; } QTreeWidgetItem* chItem = new QTreeWidgetItem(parent, QStringList() << QString(text)); chItem->setIcon(0, QIcon(":/Images/Resources/video_icon.png")); chItem->setToolTip(0, data.name + "-" + data.addr + "-" + data.location); if (type == TREE_ITEM_TYPE::TREE_VIDEO_CHANNEL || type == TREE_ITEM_TYPE::TREE_PLAN_CHANNEL) { VIDEO_CHANNEL chInfo; chInfo.device.copyFrom(data); chInfo.nChannel = channel; QVariant varChInfo; varChInfo.setValue(chInfo); chItem->setData(0, Qt::UserRole, varChInfo); } QVariant itemType(type); chItem->setData(0, Qt::UserRole + 1, itemType); }
cJSON* VideoPreview::readPreviewPlan() { cJSON* pRet = NULL; QString filePath = QApplication::applicationDirPath() + "/previewPlanConfig.json"; QFile file(filePath); bool bRet = file.open(QIODevice::ReadWrite | QIODevice::Text); if (bRet) { QByteArray ar = file.readAll(); pRet = cJSON_Parse(ar.toStdString().c_str()); file.close(); } return pRet; }