add save monitor functions

This commit is contained in:
baiYue 2025-12-05 18:55:58 +08:00
parent 993c9b8e3a
commit c7f51ae47d
11 changed files with 560 additions and 31 deletions

View File

@ -7,6 +7,7 @@
#include <QHash>
#include <QUuid>
#include <QJsonObject>
#include <QJsonArray>
#include <QWidget>
#include <QStandardItemModel>
#include "tools.h"
@ -1083,6 +1084,35 @@ struct monitorRelationSturctItem //监控关系结构item
int nEquipType; //设备类别
QString sName; //名称
QUuid uid; //id
QJsonObject toJson() const {
QJsonObject obj;
obj["nCategory"] = nCategory;
obj["nEquipType"] = nEquipType;
obj["sName"] = sName;
obj["uid"] = uid.toString();
return obj;
}
// 从JSON对象解析
void fromJson(const QJsonObject& json) {
nCategory = json["nCategory"].toInt();
nEquipType = json["nEquipType"].toInt();
sName = json["sName"].toString();
uid = QUuid::fromString(json["uid"].toString());
}
// 检查有效性
bool isValid() const {
return !uid.isNull() && !sName.isEmpty();
}
// 重载相等运算符
bool operator==(const monitorRelationSturctItem& other) const {
return uid == other.uid &&
sName == other.sName &&
nCategory == other.nCategory;
}
};
struct monitorRelationItem //监控关系item
@ -1090,6 +1120,68 @@ struct monitorRelationItem //监控关系item
monitorRelationSturctItem parent;
monitorRelationSturctItem item;
QList<monitorRelationSturctItem> subList;
QJsonObject toJson() const {
QJsonObject obj;
obj["parent"] = parent.toJson();
obj["item"] = item.toJson();
// 序列化子列表
QJsonArray subArray;
for (const auto& subItem : subList) {
subArray.append(subItem.toJson());
}
obj["subList"] = subArray;
obj["subCount"] = subList.size();
return obj;
}
// 从JSON对象解析
void fromJson(const QJsonObject& json) {
parent.fromJson(json["parent"].toObject());
item.fromJson(json["item"].toObject());
// 解析子列表
subList.clear();
QJsonArray subArray = json["subList"].toArray();
for (const QJsonValue& subValue : subArray) {
monitorRelationSturctItem sub;
sub.fromJson(subValue.toObject());
subList.append(sub);
}
}
// 检查有效性
bool isValid() const {
return parent.isValid() && item.isValid();
}
// 添加子项
void addSubItem(const monitorRelationSturctItem& subItem) {
subList.append(subItem);
}
// 移除子项
bool removeSubItem(const QUuid& subUid) {
for (int i = 0; i < subList.size(); ++i) {
if (subList[i].uid == subUid) {
subList.removeAt(i);
return true;
}
}
return false;
}
// 查找子项
monitorRelationSturctItem* findSubItem(const QUuid& subUid) {
for (auto& sub : subList) {
if (sub.uid == subUid) {
return &sub;
}
}
return nullptr;
}
};
struct monitorItemAttributeInfo //单个监控item属性
@ -1105,6 +1197,50 @@ struct monitorItemAttributeInfo //单个监控item属性
QString sTimeRange; //时间范围(分)
QString sValue; //属性值
bool bSelected = false;
// 转换为JSON对象
QJsonObject toJson() const {
QJsonObject obj;
obj["sGroup"] = sGroup;
obj["sTag"] = sTag;
obj["sName"] = sName;
obj["nConnectType"] = nConnectType;
obj["sConnectPara"] = sConnectPara;
obj["nShowType"] = nShowType;
obj["bShowDiagram"] = bShowDiagram;
obj["nGraphType"] = nGraphType;
obj["sTimeRange"] = sTimeRange;
obj["sValue"] = sValue;
obj["bSelected"] = bSelected;
return obj;
}
// 从JSON对象解析
void fromJson(const QJsonObject& json) {
sGroup = json["sGroup"].toString();
sTag = json["sTag"].toString();
sName = json["sName"].toString();
nConnectType = json["nConnectType"].toInt();
sConnectPara = json["sConnectPara"].toString();
nShowType = json["nShowType"].toInt();
bShowDiagram = json["bShowDiagram"].toBool();
nGraphType = json["nGraphType"].toInt();
sTimeRange = json["sTimeRange"].toString();
sValue = json["sValue"].toString();
bSelected = json["bSelected"].toBool();
}
// 检查有效性
bool isValid() const {
return !sTag.isEmpty() && !sName.isEmpty();
}
// 重载相等运算符
bool operator==(const monitorItemAttributeInfo& other) const {
return sTag == other.sTag &&
sName == other.sName &&
sGroup == other.sGroup;
}
};
enum class monitorItemState{ //监控item的状态
@ -1134,6 +1270,36 @@ struct monitorItemDisplayInfo //监控模式显示信息
int nHeight;
QString sMeta; //元模型名
QString sModel; //工程模名
QJsonObject toJson() const {
QJsonObject obj;
obj["nItemType"] = nItemType;
obj["sStateName"] = sStateName;
obj["bEnable"] = bEnable;
obj["sColor"] = sColor;
obj["bytPicture"] = QString(bytPicture.toBase64());
obj["nWidth"] = nWidth;
obj["nHeight"] = nHeight;
obj["sMeta"] = sMeta;
obj["sModel"] = sModel;
return obj;
}
// 从JSON对象解析 - 成员函数
void fromJson(const QJsonObject& json) {
nItemType = json["nItemType"].toInt();
sStateName = json["sStateName"].toString();
bEnable = json["bEnable"].toBool();
sColor = json["sColor"].toString();
QString pictureBase64 = json["bytPicture"].toString();
bytPicture = QByteArray::fromBase64(pictureBase64.toUtf8());
nWidth = json["nWidth"].toInt();
nHeight = json["nHeight"].toInt();
sMeta = json["sMeta"].toString();
sModel = json["sModel"].toString();
}
};
struct monitorItemTypeStruct //监控设备类型
@ -1152,6 +1318,20 @@ struct monitorItemTypeStruct //监控设备类型
bool operator<(const monitorItemTypeStruct& other) const {
return sTag < other.sTag || (sTag == other.sTag && sName < other.sName);
}
// 转换为JSON对象 - 成员函数
QJsonObject toJson() const {
QJsonObject obj;
obj["sTag"] = sTag;
obj["sName"] = sName;
return obj;
}
// 从JSON对象解析 - 成员函数
void fromJson(const QJsonObject& json) {
sTag = json["sTag"].toString();
sName = json["sName"].toString();
}
};
struct monitorItemStateStruct //监控设备状态
@ -1170,6 +1350,20 @@ struct monitorItemStateStruct //监控设备状态
bool operator<(const monitorItemStateStruct& other) const {
return sState < other.sState || (sState == other.sState && eState < other.eState);
}
// 转换为JSON对象 - 成员函数
QJsonObject toJson() const {
QJsonObject obj;
obj["sState"] = sState;
obj["eState"] = static_cast<int>(eState);
return obj;
}
// 从JSON对象解析 - 成员函数
void fromJson(const QJsonObject& json) {
sState = json["sState"].toString();
eState = static_cast<monitorItemState>(json["eState"].toInt());
}
};
struct ModelTypeInfo{ //类型临时信息

View File

@ -39,9 +39,17 @@ public:
virtual void loadNodes(QJsonObject obj) {}; //加载图元信息
virtual void saveNodes(int pageId) {}; //保存到数据库
virtual QJsonObject getDiagramInfo() {return QJsonObject();}
DesignerScene* getScene() {return m_pGraphicsScene;}
DesignerView* getView() {return m_pGraphicsView;}
void setGeneratePanelLst(QStringList lst){_lstGeneratePanel = lst;}
QStringList& getGeneratePanelLst(){return _lstGeneratePanel;}
void setGenerateByPanel(QString s) {_sGenerateByPanel = s;}
QString getGenerateByPanel() {return _sGenerateByPanel;}
PowerEntity* getEntity() {return _pEntity;}
signals:
void panelDelete(const QString&,int);
protected:
@ -58,6 +66,8 @@ protected:
QVBoxLayout* _verticalLayout;
QHBoxLayout* _horizontalLayout;
QSplitter* _hSplitter;
QStringList _lstGeneratePanel; //生成的panel列表
QString _sGenerateByPanel; //被哪个panel生成
};
#endif

View File

@ -82,6 +82,8 @@ public slots:
void onSignal_monitorSelected(DiagramInfo); //监控选中
void onSignal_saveMonitor(QList<QPair<QString,QUuid>>); //保存选中的监控
void updateMonitorListFromDB(); //从数据库更新监控列表
QMap<QString,QPair<DrawingPanel*,QMdiSubWindow*>> getMapDraw() {return m_mapDrawPanel;}
QMap<QString,QPair<EditPanel*,QMdiSubWindow*>> getMapEdit() {return m_mapEditPanel;}
QMap<QString,QPair<MonitorPanel*,QMdiSubWindow*>> getMapMonitor() {return m_mapMonitorPanel;}

View File

@ -101,7 +101,10 @@ public:
/*************************监控(运行时)**************************/
void generateMonitor(QString,QList<monitorRelationItem>); //生成监控 (监控名,选中的设备列表)
void generateMonitorConfig(MonitorPanel*); //生成监控配置参数结构
void setMonitorPara(QMap<QUuid,QList<monitorItemAttributeInfo>> map){m_monitorPara = map;}
QMap<QUuid,QList<monitorItemAttributeInfo>>& getMonitorPara() {return m_monitorPara;}
void setMonitorRelation(QList<monitorRelationItem> lst){m_lstMonitorRelation = lst;}
QList<monitorRelationItem> getMonitorRelation() {return m_lstMonitorRelation;}
void monitorItemSelected(QUuid); //运行时item选中事件
void monitorItemDetailAttr(QUuid); //显示属性详情
@ -164,6 +167,7 @@ private:
QMap<QUuid,QList<monitorItemAttributeInfo>> m_monitorPara; //监控参数
QMap<int,QList<QPair<monitorItemState,QString>>> m_monitorStateMap; //元件状态对照表 <type,<state,状态名>>
QMap<monitorItemTypeStruct,QMap<monitorItemStateStruct,monitorItemDisplayInfo>> m_monitorDisplaySetting; //元件设置
QList<monitorRelationItem> m_lstMonitorRelation; //监控item层级关系
public:
static bool _dataInitialised;
};

View File

@ -35,6 +35,16 @@ public:
void initDisplayState(); //初始化显示状态参照表
void initDisplaySetting(); //初始化显示状态设置
public:
//对层级关系的序列化与反序列化
QJsonArray serializeRelationToJsonArray(const QList<monitorRelationItem>& data) const;
bool deserializeRelationFromJsonArray(const QJsonArray& jsonArray, QList<monitorRelationItem>& result);
//对para的序列化与反序列化
QJsonArray serializeParaToJsonArray(const QMap<QUuid, QList<monitorItemAttributeInfo>>& data) const;
bool deserializeParaFromJsonArray(const QJsonArray& jsonArray,QMap<QUuid, QList<monitorItemAttributeInfo>>& result);
//对displaySetiing的序列化与反序列化
QJsonArray serializeDisplayToJsonArray(const QMap<monitorItemTypeStruct, QMap<monitorItemStateStruct, monitorItemDisplayInfo>>& data) const;
void deserializeDisplayFromJsonArray(const QJsonArray& jsonArray,QMap<monitorItemTypeStruct, QMap<monitorItemStateStruct, monitorItemDisplayInfo>>& result);
public slots:
void onRunClicked();
void onStopClicked();

View File

@ -14,11 +14,12 @@ BaseDrawingPanel::BaseDrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramM
: QWidget(parent)
,_pModel(nullptr)
,_mode(mode)
,_pEntity(pEntity)
,_pEntity(nullptr)
,_verticalLayout(nullptr)
,_horizontalLayout(nullptr)
,_hSplitter(nullptr)
{
_pEntity = pEntity;
_pModel = new FixedPortsModel(pEntity);
_pModel->setTopWidget(this);
m_pSelectorManager = new SelectorManager(_pModel,this);

View File

@ -116,15 +116,31 @@ void DiagramCavas::onSignal_addPage()
void DiagramCavas::onSignal_savePage()
{
QWidget* pWindow= currentSubWindow()->widget();
DrawingPanel* pPanel = dynamic_cast<DrawingPanel*>(pWindow);
BaseDrawingPanel* pPanel = dynamic_cast<BaseDrawingPanel*>(pWindow);
if(pPanel)
{
if(pPanel->getMode() == DM_run)
{
QMessageBox::about(NULL,QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"运行中无法保存!"));
auto pMonitor = dynamic_cast<MonitorPanel*>(pPanel);
if(pMonitor){
if(DataBase::GetInstance()->getPageIdByName(pMonitor->getParentPage()) == -1){
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"请先保存工程模型"));
return;
}
auto pEntity = pMonitor->getEntity();
if(pEntity){
if(DataBase::GetInstance()->getMonitorIdByName(pEntity->name()).isNull()) //不存在,创建
DataBase::GetInstance()->insertMonitor(QUuid(pEntity->id()),pEntity->name(),pEntity->name(),pMonitor->getParentPage(),pMonitor->getMonitorInfo());
else
DataBase::GetInstance()->updateMonitor(pEntity->name(),pMonitor->getMonitorInfo());
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功"));
}
}
}
else if(pPanel->getMode() == DM_edit)
{
auto pDrawPanel = dynamic_cast<MonitorPanel*>(pPanel);
_curPage = pPanel->pageName();
QMessageBox msgBox;
msgBox.setText(QString::fromWCharArray(L"提示"));
@ -215,8 +231,8 @@ void DiagramCavas::onSignal_loadMonitor(PowerEntity* p)
if(!m_mapMonitorPanel.contains(p->name()))
{
onSignal_addDrawingPanel(p,DiagramMode::DM_run);
//QJsonObject context = DataBase::GetInstance()->getPageContextByName(p->name());
//m_mapDrawPanel[p->name()].first->loadNodes(context);
QJsonObject context = DataBase::GetInstance()->getMonitorContextByTag(p->name());
m_mapMonitorPanel[p->name()].first->loadNodes(context);
}
else //已存在
{
@ -609,3 +625,16 @@ void DiagramCavas::onSignal_saveMonitor(QList<QPair<QString,QUuid>> lst)
}
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功"));
}
void DiagramCavas::updateMonitorListFromDB()
{
QList<monitorPageInfo> lstMonitor = DataBase::GetInstance()->getAllMonitor();
for(auto &info:lstMonitor)
{
auto p = TopologyManager::instance().findDiagram(info.uid.toString(),ModelFunctionType::RuntimeModel);
if(!p){
TopologyManager::instance().createDiagram(info.uid.toString(),info.name,ModelFunctionType::RuntimeModel);
emit updateMonitorList(info.parent,qMakePair(info.name,info.uid));
}
}
}

View File

@ -319,13 +319,6 @@ void DrawingPanel::loadNodes(QJsonObject obj)
}
}
emit _pModel->updateCurrentItems(lstSecond,false);
}
if(_mode == DM_run)
{
//if(_pModel)
//_pModel->startHttpRequest();
}
}

View File

@ -139,7 +139,7 @@ bool FixedPortsModel::addNodeItem(QUuid uuid,GraphicsProjectModelItem* pItem)
}
}
QString FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos,double width,double height,double rotate)
QString FixedPortsModel::addNodeItem(QUuid id,QPointF pos,double width,double height,double rotate)
{
//todo:load图形时必有拓扑实体关联到对应的entity
BaseProperty* pro = nullptr;
@ -776,8 +776,12 @@ void FixedPortsModel::loadNodeDataFromDataBase()
QString FixedPortsModel::addConnectLline(QUuid lineId,QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort)
{
GraphicsProjectModelItem* src = _nodeItem[srcId];
GraphicsProjectModelItem* dest = _nodeItem[destId];
GraphicsProjectModelItem* src = nullptr;
if(_nodeItem.contains(srcId))
src = _nodeItem.value(srcId);
GraphicsProjectModelItem* dest = nullptr;
if(_nodeItem.contains(destId))
dest = _nodeItem.value(destId);
QMap<QUuid,BaseProperty*> mapData = BasePropertyManager::instance().getEntityData();
if(mapData.contains(lineId))
{
@ -2596,6 +2600,10 @@ void FixedPortsModel::generateMonitor(QString sPage,QList<monitorRelationItem> l
info.parentId = _pEntity->id();
_cavas->onSignal_createDiagram(info,DiagramMode::DM_run);
pPanel = _cavas->getMonitorPanel(sPage);
pPanel->getModelController()->setMonitorRelation(lst);
_widget->getGeneratePanelLst().append(sPage); //记录生成的运行页
pPanel->setParentPage(_pageName); //生成页记录被哪个组态生成
QList<monitorRelationItem> lstFirst;
for(auto& itemInfo:lst)
@ -2749,23 +2757,10 @@ void FixedPortsModel::monitorItemDetailAttr(QUuid uid)
void FixedPortsModel::monitorItemSet(QUuid uid)
{
if(_nodeItem.contains(uid)){
//QList<QString> lstRemove; //需要从item移除的动态数据
QList<QString> lstAdd; //需要向item添加的动态数据
auto pItem = _nodeItem.value(uid);
auto lst = m_monitorPara.value(uid);
//auto mapText = pItem->getDynamicText();
/*for(auto iter = mapText.begin();iter != mapText.end();++iter){
bool exist = false;
for(auto& info:lst){
if(info.sTag == iter.key()){ //新旧队列都存在
exist = true;
}
}
if(!exist)
lstRemove.append(iter.key());
}*/
for(auto& info:lst){
if(info.bShowDiagram && info.bSelected){
@ -2773,9 +2768,6 @@ void FixedPortsModel::monitorItemSet(QUuid uid)
}
}
/*for(auto& str:lstRemove){
pItem->removeDynamicText(str);
}*/
pItem->removeAllDynamicText();
for(auto& str:lstAdd){

View File

@ -4,6 +4,7 @@
#include <QCloseEvent>
#include <QToolBar>
#include <QVBoxLayout>
#include <QJsonDocument>
#include "graphicsDataModel/fixedPortsModel.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "powerEntity.h"
@ -160,13 +161,144 @@ QJsonObject MonitorPanel::getMonitorInfo() const
}
}
obj["bays"] = arrBay;
auto relation = serializeRelationToJsonArray(_pModel->getMonitorRelation());
obj["relation"] = relation;
auto para = serializeParaToJsonArray(_pModel->getMonitorPara()); //设定参数
obj["para"] = para;
auto settingArr = serializeDisplayToJsonArray(_pModel->getMonitorDisplaySetting()); //显示参数
obj["displaySetting"] = settingArr;
}
return obj;
}
void MonitorPanel::loadNodes(QJsonObject obj)
{
QJsonArray nodesJsonArray = obj["nodes"].toArray();
QList<QPair<QString,QUuid>> lst;
for (QJsonValueRef nodeJson : nodesJsonArray)
{
QJsonObject node = nodeJson.toObject();
QString uuid = node["id"].toString();
double dX = node["x"].toDouble();
double dY = node["y"].toDouble();
double dWidth = node["width"].toDouble();
double dHeight = node["height"].toDouble();
double dRotate = node["rotate"].toDouble();
if(_pModel)
{
QString sName = _pModel->addNodeItem(QUuid(uuid),QPointF(dX,dY),dWidth,dHeight,dRotate);
if(sName != "err"){
lst.append(qMakePair(sName,QUuid(uuid)));
}
}
}
QJsonArray connectArr = obj["connections"].toArray();
for(QJsonValueRef connectJson:connectArr)
{
QJsonObject connect = connectJson.toObject();
QUuid id = QUuid(connect["id"].toString()); //电缆线id关联component中的电缆
QUuid srcId = QUuid(connect["SrcNodeId"].toString());
QUuid srcPortId = QUuid(connect["SrcPortId"].toString());
QUuid destId = QUuid(connect["DestNodeId"].toString());
QUuid destPortId = QUuid(connect["DestPortId"].toString());
PowerConnection* pCon = TopologyManager::instance().connection(srcPortId.toString(),destPortId.toString());
if(pCon)
{
QString srcItemId = pCon->fromComponent();
QString destItemId = pCon->toComponent();
//todo:从拓扑结构中查找port的id
if(_pModel)
{
QString sName = _pModel->addConnectLline(id,QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId);
if(sName != "err"){
lst.append(qMakePair(sName,QUuid(id)));
}
}
}
else
{
//todo:提示拓扑结构已改变
}
}
QJsonArray bayArr = obj["bays"].toArray();
for(QJsonValueRef bayJson:bayArr)
{
QJsonObject bay = bayJson.toObject();
QUuid id = QUuid(bay["id"].toString());
if(_pModel)
{
_pModel->addBayItem(id);
}
}
QJsonArray paraArr = obj["para"].toArray();
QMap<QUuid, QList<monitorItemAttributeInfo>> mapPara;
bool resPara = deserializeParaFromJsonArray(paraArr,mapPara);
if(resPara){
if(_pModel){
_pModel->setMonitorPara(mapPara);
auto pItems = _pModel->getProjectItems();
for(auto& p:pItems){ //将设置值更新到每个item
auto pPro = p->getProperty();
if(pPro)
_pModel->monitorItemSet(pPro->uuid());
}
}
}
QJsonArray displayArr = obj["displaySetting"].toArray();
QMap<monitorItemTypeStruct, QMap<monitorItemStateStruct, monitorItemDisplayInfo>> mapDisplay;
deserializeDisplayFromJsonArray(displayArr,mapDisplay);
if(_pModel){
_pModel->setMonitorDisplaySetting(mapDisplay);
_pModel->updateMonitorDisplay();
}
QJsonArray relationArr = obj["relation"].toArray();
QList<monitorRelationItem> lstRelation;
bool resRel = deserializeRelationFromJsonArray(relationArr, lstRelation);
if(resRel){
QList<monitorRelationItem> lstFirst;
if(_pModel){
auto pItems = _pModel->getProjectItems();
for(auto& itemInfo:lstRelation)
{
if(itemInfo.item.nCategory == 0){ //设备
if(pItems.contains(itemInfo.item.uid)){
if(itemInfo.item.nEquipType == 1 || itemInfo.item.nEquipType == 15 || itemInfo.item.nEquipType == 16){ //先添加母线及独立设备
lstFirst.append(itemInfo);
}
}
}
}
QList<monitorRelationItem> lstSecond;
for(auto& itemInfo:lstRelation) //第二次循环处理间隔内设备
{
if(itemInfo.item.nCategory == 0){ //间隔
if(pItems.contains(itemInfo.item.uid)){
if(itemInfo.item.nEquipType != 1 && itemInfo.item.nEquipType != 15 && itemInfo.item.nEquipType != 16){
lstSecond.append(itemInfo);
}
}
}
}
updateSelectedItems(lstFirst,true); //直接生成监控tree
updateSelectedItems(lstSecond,false);
_pModel->setMonitorRelation(lstRelation);
}
}
}
void MonitorPanel::saveNodes(int pageId)
@ -465,3 +597,162 @@ void MonitorPanel::initDisplaySetting()
_pModel->getMonitorDisplaySetting().insert(keyType,mapStates);
}
}
QJsonArray MonitorPanel::serializeRelationToJsonArray(const QList<monitorRelationItem>& data) const
{
QJsonArray rootArray;
for (const auto& relationItem : data) {
rootArray.append(relationItem.toJson());
}
return rootArray;
}
// 从 QJsonArray 反序列化到 QList<monitorRelationItem>
bool MonitorPanel::deserializeRelationFromJsonArray(const QJsonArray& jsonArray, QList<monitorRelationItem>& result)
{
result.clear();
for (const QJsonValue& itemValue : jsonArray) {
if (!itemValue.isObject()) continue;
monitorRelationItem relationItem;
relationItem.fromJson(itemValue.toObject());
if (relationItem.isValid()) {
result.append(relationItem);
}
}
return true;
}
QJsonArray MonitorPanel::serializeParaToJsonArray(const QMap<QUuid, QList<monitorItemAttributeInfo>>& data) const
{
QJsonArray rootArray;
for (auto it = data.begin(); it != data.end(); ++it) {
const QUuid& uuid = it.key();
const QList<monitorItemAttributeInfo>& attributeList = it.value();
QJsonObject uuidObject;
uuidObject["uuid"] = uuid.toString();
QJsonArray attributesArray;
// 序列化属性列表
for (const auto& attribute : attributeList) {
attributesArray.append(attribute.toJson());
}
uuidObject["attributes"] = attributesArray;
uuidObject["attributeCount"] = attributesArray.size();
rootArray.append(uuidObject);
}
return rootArray;
}
// 从 QJsonArray 反序列化到 QMap<QUuid, QList<monitorItemAttributeInfo>>
bool MonitorPanel::deserializeParaFromJsonArray(const QJsonArray& jsonArray,
QMap<QUuid, QList<monitorItemAttributeInfo>>& result)
{
result.clear();
for (const QJsonValue& uuidValue : jsonArray) {
if (!uuidValue.isObject()) continue;
QJsonObject uuidObject = uuidValue.toObject();
// 解析UUID
QUuid uuid = QUuid::fromString(uuidObject["uuid"].toString());
if (uuid.isNull()) continue;
// 解析属性列表
QList<monitorItemAttributeInfo> attributeList;
QJsonArray attributesArray = uuidObject["attributes"].toArray();
for (const QJsonValue& attrValue : attributesArray) {
if (!attrValue.isObject()) continue;
monitorItemAttributeInfo attribute;
attribute.fromJson(attrValue.toObject());
attributeList.append(attribute);
}
result[uuid] = attributeList;
}
return true;
}
QJsonArray MonitorPanel::serializeDisplayToJsonArray(const QMap<monitorItemTypeStruct, QMap<monitorItemStateStruct, monitorItemDisplayInfo>>& data) const
{
QJsonArray rootArray;
for (auto typeIt = data.begin(); typeIt != data.end(); ++typeIt) {
const monitorItemTypeStruct& typeKey = typeIt.key();
const auto& stateMap = typeIt.value();
QJsonObject typeObject;
typeObject["typeKey"] = typeKey.toJson();
QJsonArray statesArray;
for (auto stateIt = stateMap.begin(); stateIt != stateMap.end(); ++stateIt) {
const monitorItemStateStruct& stateKey = stateIt.key();
const monitorItemDisplayInfo& displayInfo = stateIt.value();
QJsonObject stateObject;
stateObject["stateKey"] = stateKey.toJson();
stateObject["displayInfo"] = displayInfo.toJson();
statesArray.append(stateObject);
}
typeObject["states"] = statesArray;
rootArray.append(typeObject);
}
return rootArray;
}
// 从JSON数组反序列化
void MonitorPanel::deserializeDisplayFromJsonArray(const QJsonArray& jsonArray,QMap<monitorItemTypeStruct, QMap<monitorItemStateStruct, monitorItemDisplayInfo>>& result)
{
result.clear();
for (const QJsonValue& typeValue : jsonArray) {
if (!typeValue.isObject()) continue;
QJsonObject typeObject = typeValue.toObject();
// 解析类型键
monitorItemTypeStruct typeKey;
typeKey.fromJson(typeObject["typeKey"].toObject());
QMap<monitorItemStateStruct, monitorItemDisplayInfo> stateMap;
QJsonArray statesArray = typeObject["states"].toArray();
for (const QJsonValue& stateValue : statesArray) {
if (!stateValue.isObject()) continue;
QJsonObject stateObject = stateValue.toObject();
monitorItemStateStruct stateKey;
stateKey.fromJson(stateObject["stateKey"].toObject());
monitorItemDisplayInfo displayInfo;
displayInfo.fromJson(stateObject["displayInfo"].toObject());
stateMap[stateKey] = displayInfo;
}
result[typeKey] = stateMap;
}
}

View File

@ -204,6 +204,9 @@ void CMainWindow::initializeAction()
_pActMonitor->setChecked(true);
m_pMonitorItemsDock->show();
m_pMonitorPagesDock->show();
if(m_pDiagramCavas)
m_pDiagramCavas->updateMonitorListFromDB();
}
});