topologic serialize finish

This commit is contained in:
baiYue 2025-05-16 19:20:46 +08:00
parent 267026ddc4
commit a5259319f7
42 changed files with 1219 additions and 285 deletions

View File

@ -43,7 +43,18 @@ public:
enum DiagramMode //组态图模式
{
DM_edit = 0,
DM_run
DM_run,
DM_academic
};
enum VariantIcon //变种图
{
VI_thumbnail = 0,
VI_normal_1,
VI_normal_2,
VI_normal_3,
VI_normal_4,
VI_normal_5
};
enum Attribute //元模属性字段对照
@ -229,6 +240,12 @@ struct propertyContentInfo //单个属性结构
};
//==================组态拓扑结构======================
enum class DataState
{
unchanged = 0,
changed,
prepareDelete
};
/*struct diagramInfo
{
QString name;
@ -314,7 +331,31 @@ struct componentInfo
int op = 0;
};
struct busStability
struct topologicInfo
{
int id = -1;
int page_id;
QUuid uuid_from;
QUuid uuid_to;
QUuid pin_from;
QUuid pin_to;
int flag;
QString description;
int op;
};
struct pageInfo
{
int id = -1;
QString tag;
QString name;
int status;
QJsonObject label;
QJsonObject context;
QString description;
int op;
};
/*struct busStability
{
int componentId = 0;
double resistance = 0;
@ -324,7 +365,7 @@ struct busStability
bool anchor_i = false;
double ui_alarm = 0;
double oi_alarm = 0;
};
};*/
//Q_ENUM_NS(GraphicsItemType)
/**

View File

@ -67,4 +67,6 @@ private:
};
int getLevel(QStandardItem *item);
QModelIndex findIndex(const QAbstractItemModel* model, const QVariant& target,
int role = Qt::DisplayRole, const QModelIndex& parent = QModelIndex());
#endif // DATABASE_H

View File

@ -15,3 +15,21 @@ int getLevel(QStandardItem *item) {
return -1;
}
}
QModelIndex findIndex(const QAbstractItemModel* model, const QVariant& target,
int role, const QModelIndex& parent) {
for (int row = 0; row < model->rowCount(parent); ++row) {
QModelIndex idx = model->index(row, 0, parent); // 假设查找第0列
if (model->data(idx, role) == target) {
return idx; // 找到匹配项
}
// 递归查找子项
if (model->hasChildren(idx)) {
QModelIndex childIdx = findIndex(model, target, role, idx);
if (childIdx.isValid()) {
return childIdx;
}
}
}
return QModelIndex(); // 未找到
}

View File

@ -11,9 +11,11 @@ set(DIAGRAMCAVAS_HEADER_FILES
include/serializable.h
include/statusBar.h
include/powerEntity.h
include/topologyManager.h
include/powerConnection.h
include/powerTerminal.h
include/topologyManager.h
include/baseInfoDlg.h
include/baseContentDlg.h
include/graphicsDataModel/baseModel.h
include/graphicsDataModel/fixedPortsModel.h
include/graphicsItem/electricConnectLineItem.h
@ -56,9 +58,11 @@ set(DIAGRAMCAVAS_SOURCE_FILES
source/propertyContentDlg.cpp
source/statusBar.cpp
source/powerEntity.cpp
source/topologyManager.cpp
source/powerConnection.cpp
source/powerTerminal.cpp
source/topologyManager.cpp
source/baseInfoDlg.cpp
source/baseContentDlg.cpp
#source/serializable.cpp
source/graphicsDataModel/baseModel.cpp
source/graphicsDataModel/fixedPortsModel.cpp
@ -91,6 +95,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES
set(UI_FILES
ui/drawingPanel.ui
ui/itemPropertyDlg.ui
ui/baseInfoDlg.ui
)
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)

View File

@ -0,0 +1,27 @@
#ifndef BASECONTENTDLG_H
#define BASECONTENTDLG_H
#include <QDialog>
#include <QVBoxLayout>
#include <QFormLayout>
#include "global.h"
/*******************************************************
********************************************************/
class BaseContentDlg : public QDialog
{
Q_OBJECT
public:
BaseContentDlg(QWidget *parent = nullptr);
virtual ~BaseContentDlg();
virtual void createGroupView(groupStateInfo) = 0; //创建页面
virtual QMap<QString,propertyStateInfo> getPropertyValue() = 0; //返回当前页面的属性值
virtual void setPropertyValue(QMap<QString,propertyStateInfo>) = 0;
protected:
QMap<QString,propertyContentInfo> _mapPro;
QFormLayout* createFormLayout(QWidget* parent);
};
#endif

View File

@ -0,0 +1,27 @@
#ifndef BASEINFODLG_H
#define BASEINFODLG_H
#include <QWidget>
#include "baseContentDlg.h"
QT_BEGIN_NAMESPACE
namespace Ui { class baseInfoDlg; }
QT_END_NAMESPACE
class BaseInfoDlg : public BaseContentDlg
{
Q_OBJECT
public:
BaseInfoDlg(QWidget *parent = nullptr);
~BaseInfoDlg();
virtual void createGroupView(groupStateInfo);
virtual QMap<QString,propertyStateInfo> getPropertyValue();
virtual void setPropertyValue(QMap<QString,propertyStateInfo>);
private:
Ui::baseInfoDlg *ui;
};
#endif

View File

@ -34,9 +34,9 @@ public:
QVariant nodeData(QUuid nodeId, NodeRole role) const;
BaseProperty* addNodeData(QUuid id,int type,QString name,QString modelName); //对应component数据一个data可对应多个item
void loadNodeDataFromDataBase(); //从数据库加载数据
void addConnectLline(QUuid srcId,QUuid destId,int srcPort,int destPort);
void addConnectLline(QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort);
void deleteNodeItem(GraphicsBaseItem*);
QJsonObject saveNode(QUuid const) const;
//QJsonObject saveNode(QUuid const) const;
void saveNode(int nPageId);
void setScene(DesignerScene* p){_scene = p;}
void setTopWidget(DrawingPanel* p) {_widget = p;}
@ -48,7 +48,8 @@ public:
void initialPropertyDlg(); //初始化属性设置dlg每个模型拥各自的dlg
void generatePropertyDlg(const QString&);
ConfigurationDiagram* getTopologyDiagram(); //返回当前组态图的拓扑实体
void createTopoTerminals(GraphicsBaseItem*);
void createTopoTerminalsByItem(GraphicsBaseItem*); //通过图形对象创建port接线点(新建)
void createTopoTerminalsByData(PowerEntity* pParent,QJsonObject componentCon); //通过componet数据创建port接线点(加载)
bool isItemValid(GraphicsBaseItem*); //判断item是否可以连接
Q_SIGNALS:
void activatePage(const QString&); //激活当前model所在page

View File

@ -8,23 +8,18 @@
struct Connection
{
QUuid nSrcNodeId;
int nSrcPort;
QUuid nSrcPortId;
HandleType srcType;
PortPos srcPos;
QUuid nDestNodeId;
int nDestPort;
QUuid nDestPortId;
HandleType destType;
PortPos destPos;
Connection()
{
//nSrcNodeId = -1;
nSrcPort = -1;
srcType = T_none;
srcPos = P_top;
//nDestNodeId = -1;
nDestPort = -1;
destType = T_none;
destPos = P_top;
}
@ -32,29 +27,29 @@ struct Connection
Connection(const Connection& obj)
{
nSrcNodeId = obj.nSrcNodeId;
nSrcPort = obj.nSrcPort;
nSrcPortId = obj.nSrcPortId;
srcType = obj.srcType;
srcPos = obj.srcPos;
nDestNodeId = obj.nDestNodeId;
nDestPort = obj.nDestPort;
nDestPortId = obj.nDestPortId;
destType = obj.destType;
destPos = obj.destPos;
}
Connection(QUuid nSNI,int nSP,HandleType sT,PortPos sPOS,QUuid nDNI,int nDP,HandleType dT,PortPos dPOS)
Connection(QUuid nSNI,QUuid nSPI,HandleType sT,PortPos sPOS,QUuid nDNI,QUuid nDPI,HandleType dT,PortPos dPOS)
{
nSrcNodeId = nSNI;
nSrcPort = nSP;
nSrcPortId = nSPI;
srcType = sT;
srcPos = sPOS;
nDestNodeId = nDNI;
nDestPort = nDP;
nDestPortId = nDPI;
destType = dT;
destPos = dPOS;
}
bool operator==(const Connection& obj)
{
return ((obj.nSrcNodeId == nSrcNodeId)&&(obj.nSrcPort == nSrcPort)&&(obj.srcType == srcType)&&(obj.nDestNodeId == nDestNodeId)&&(obj.nDestPort == nDestPort)&&(obj.destType == destType));
return ((obj.nSrcNodeId == nSrcNodeId)&&(obj.nSrcPortId == nSrcPortId)&&(obj.srcType == srcType)&&(obj.nDestNodeId == nDestNodeId)&&(obj.nDestPortId == nDestPortId)&&(obj.destType == destType));
}
Connection& operator=(const Connection& obj)
@ -62,11 +57,11 @@ struct Connection
if(*this == obj)
return *this;
nSrcNodeId = obj.nSrcNodeId;
nSrcPort = obj.nSrcPort;
nSrcPortId = obj.nSrcPortId;
srcType = obj.srcType;
srcPos = obj.srcPos;
nDestNodeId = obj.nDestNodeId;
nDestPort = obj.nDestPort;
nDestPortId = obj.nDestPortId;
destType = obj.destType;
destPos = obj.destPos;
return *this;

View File

@ -8,7 +8,7 @@ class ElectricSvgItem :public GraphicsBaseItem
{
Q_OBJECT
public:
ElectricSvgItem(const QRect &rect, QGraphicsItem *parent = 0);
ElectricSvgItem(const QRect &rect, bool genNewPort = true,QGraphicsItem *parent = 0); //genNewPort生成新接线点
virtual ~ElectricSvgItem();
void resize(int,double, double, const QPointF&);
void updateCoordinate();

View File

@ -9,7 +9,7 @@ class ElectricSvgItemRect :public ElectricSvgItem
{
Q_OBJECT
public:
ElectricSvgItemRect(const QRect &rect, QGraphicsItem *parent = 0);
ElectricSvgItemRect(const QRect &rect, bool genNewPort = true,QGraphicsItem *parent = 0);
virtual ~ElectricSvgItemRect();
//virtual void updateByProperty();

View File

@ -466,7 +466,7 @@ public:
virtual void setLabelVoltage(const QString& str); //设置电压标签
virtual QString getLabelVoltage() const;
virtual int addPort(PortState typ,QPointF vec,QString id = "",HandleType hType = T_lineInOut,PortPos pos = P_top); //新建,返回-1失败
virtual void addPort(PortState typ,int ntagId,QPointF vec); //载入 PortState为P_const时QPointF中为(0~10~1)的相对位置;PortState为p_movable时QPointF为坐标值
//virtual void addPort(PortState typ,int ntagId,QPointF vec); //载入 PortState为P_const时QPointF中为(0~10~1)的相对位置;PortState为p_movable时QPointF为坐标值
virtual QUuid itemId() const {return m_itemId;}
virtual void setItemId(QUuid n){m_itemId = n;}
virtual void setState(ItemState s){m_state = s;}
@ -476,6 +476,7 @@ public:
virtual GraphicsItemType getItemType() const {return m_Itemtype;}
virtual void setLastPort(int n){_lastPort = n;}
virtual int getLastPort() const {return _lastPort;}
virtual ItemPort* getPortById(QString) const;
virtual ItemPort* getPortPtr(int) const;
virtual ItemControlHandle* getHandlePtr(int) const;
virtual QMap<QString,ItemPort*> getPorts() {return m_mapPort;}

View File

@ -5,17 +5,22 @@
* *************************/
#include <QObject>
#include <QVariant>
#include "global.h"
// 连接线元数据(抽象连接关系)
class PowerConnection : public QObject {
Q_OBJECT
public:
PowerConnection(const QString& uuid,const QString& fromTerminalId,const QString& toTerminalId,QObject* parent = nullptr);
PowerConnection(const QString& uuid,const QString& fromTerminalId,const QString& toTerminalId,const QString& fromId,const QString& toId,QObject* parent = nullptr);
QString id() const {return m_uuid;}
QString fromTerminalId() const { return m_fromTerminal; }
QString toTerminalId() const { return m_toTerminal; }
QString fromComponent() const {return m_fromComponent;}
QString toComponent() const {return m_toComponent;}
QVariantMap properties() const { return m_properties; }
DataState state() {return m_state;}
void setState(DataState s) {m_state = s;}
void setProperty(const QString& key, const QVariant& value);
@ -25,6 +30,9 @@ private:
QString m_uuid;
QString m_fromTerminal;
QString m_toTerminal;
QString m_fromComponent;
QString m_toComponent;
DataState m_state;
QVariantMap m_properties;
};
#endif //POWETCONNECTION_H

View File

@ -5,11 +5,12 @@
#include <QVBoxLayout>
#include <QFormLayout>
#include "global.h"
#include "baseContentDlg.h"
/*******************************************************
itemPropertyDlg
********************************************************/
class PropertyContentDlg : public QDialog
class PropertyContentDlg : public BaseContentDlg
{
Q_OBJECT
@ -17,16 +18,13 @@ public:
PropertyContentDlg(QWidget *parent = nullptr);
~PropertyContentDlg();
void createGroupView(groupStateInfo); //创建页面
QWidget* createEditor(propertyStateInfo); //创建属性
QMap<QString,propertyStateInfo> getPropertyValue() const; //返回当前页面的属性值
void setPropertyValue(QMap<QString,propertyStateInfo>);
private:
virtual void createGroupView(groupStateInfo); //创建页面
virtual QMap<QString,propertyStateInfo> getPropertyValue(); //返回当前页面的属性值
virtual void setPropertyValue(QMap<QString,propertyStateInfo>);
protected:
QVBoxLayout* _layout;
QWidget* createEditor(propertyStateInfo); //创建属性
QMap<QString,propertyContentInfo> _mapPro;
private:
QFormLayout* createFormLayout(QWidget* parent);
};
#endif

View File

@ -23,7 +23,7 @@ public:
bool deleteEntity(const QString& id);
// 连接管理
PowerConnection* createConnection(const QString& uuid,const QString& fromId, const QString& toId);
PowerConnection* createConnection(const QString& uuid,const QString& fromTerId, const QString& toTerId,const QString& fromId,const QString& toId);
QList<PowerConnection*> getConnectionsForTerminal(const QString& terminalId) const;
void removeConnection(const QString& connId);
bool validateConnection(const QString& fromTermId, const QString& toTermId) const;
@ -33,9 +33,11 @@ public:
QList<PowerConnection*> connectionsTo(const QString& elementId) const;
QList<PowerConnection*> getConnectionsFor(const QString& entityId) const;
PowerConnection* connection(const QString& conId) const;
PowerConnection* connection(const QString& fromPin,const QString& toPin);
QHash<QString,PowerConnection*> getAllConnections();
void saveToDB(const QString& path);
void loadFromDB(const QString& path);
//void saveToDB(const QString& path);
//void loadFromDB(const QString& path);
PowerEntity* getEntity(const QString& id) const;
QList<PowerEntity*> findEntitiesByName(const QString& name) const;

View File

@ -0,0 +1,29 @@
#include "baseContentDlg.h"
#include <QScrollArea>
#include <QFormLayout>
#include <QLabel>
#include <QSpinBox>
#include <QLineEdit>
#include <QDateEdit>
BaseContentDlg::BaseContentDlg(QWidget *parent)
: QDialog(parent)
{
setWindowFlags(Qt::Widget);
//this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
}
BaseContentDlg::~BaseContentDlg()
{
}
QFormLayout* BaseContentDlg::createFormLayout(QWidget* parent)
{
QFormLayout* layout = new QFormLayout(parent);
layout->setHorizontalSpacing(20); // 标签与控件间距
layout->setVerticalSpacing(12); // 行间距
layout->setLabelAlignment(Qt::AlignRight); // 标签右对齐
layout->setContentsMargins(12, 12, 12, 12); // 内边距
return layout;
}

View File

@ -0,0 +1,65 @@
#include "baseInfoDlg.h"
#include "ui_baseInfoDlg.h"
BaseInfoDlg::BaseInfoDlg(QWidget *parent)
: BaseContentDlg(parent)
, ui(new Ui::baseInfoDlg)
{
ui->setupUi(this);
//this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
}
BaseInfoDlg::~BaseInfoDlg()
{
delete ui;
}
void BaseInfoDlg::createGroupView(groupStateInfo infos)
{
}
QMap<QString,propertyStateInfo> BaseInfoDlg::getPropertyValue()
{
QMap<QString,propertyStateInfo> map;
propertyStateInfo uuid;
uuid.type = "UUID";
uuid.name = "global_uuid";
uuid.defaultValue = ui->le_uuid->text();
map.insert(uuid.name,uuid);
propertyStateInfo tag;
tag.type = "VARCHAR";
tag.name = "tag";
tag.defaultValue = ui->le_tag->text();
map.insert(tag.name,tag);
propertyStateInfo nsPath;
nsPath.type = "VARCHAR";
nsPath.name = "nspath";
nsPath.defaultValue = ui->le_nameSpace->text();
map.insert(nsPath.name,nsPath);
propertyStateInfo pName;
pName.type = "VARCHAR";
pName.name = "name";
pName.defaultValue = ui->le_name->text();
map.insert(pName.name,pName);
propertyStateInfo label;
label.type = "JSONB";
label.name = "label";
label.defaultValue = ui->le_label->text();
map.insert(label.name,label);
return map;
}
void BaseInfoDlg::setPropertyValue(QMap<QString,propertyStateInfo> map)
{
for(auto &info:map)
{
propertyContentInfo pro = _mapPro[info.name];
}
}

View File

@ -1,3 +1,7 @@
#include <QMdiSubWindow>
#include <QMessageBox>
#include <QJsonObject>
#include <QStandardItem>
#include "drawingPanel.h"
#include "diagramCavas.h"
#include "mainwindow.h"
@ -5,9 +9,7 @@
#include "graphicsItem/graphicsBaseItem.h"
#include "topologyManager.h"
#include "powerEntity.h"
#include <QMdiSubWindow>
#include <QMessageBox>
#include <QJsonObject>
#include "componentIconManager.h"
DiagramCavas::DiagramCavas(QWidget *parent)
: QMdiArea(parent)
@ -23,7 +25,13 @@ DiagramCavas::~DiagramCavas()
void DiagramCavas::initial()
{
//todo:读取数据并初始化
//onSignal_addDrawingPanel(QString("electricElements"));
QList<pageInfo> lst = DataBase::GetInstance()->getAllPage();
for(auto info:lst)
{
TopologyManager::instance().createDiagram(QString::number(info.id),info.name);
}
//QString sPath = ComponentIconManager::instance().getIconPath("circuitBreaker",DM_edit,VI_thumbnail);
}
void DiagramCavas::onSignal_addDrawingPanel(PowerEntity* pItem,DiagramMode mode)
@ -275,7 +283,7 @@ void DiagramCavas::onSignal_deleteDiagram(DiagramInfo info)
void DiagramCavas::onSignal_selectDiagram(DiagramInfo info)
{
PowerEntity* pEntity = TopologyManager::instance().findDiagram(info.id.toString());
PowerEntity* pEntity = TopologyManager::instance().findDiagram(QString::number(info.id.toInt()));
if(pEntity)
{
onSignal_loadPage(pEntity);

View File

@ -10,6 +10,7 @@
#include "statusBar.h"
#include "dataBase.h"
#include "powerEntity.h"
#include "topologyManager.h"
DrawingPanel::DrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode)
: QWidget(parent)
@ -183,9 +184,9 @@ QJsonObject DrawingPanel::getDiagramInfo() const
{
QJsonObject connect;
connect["SrcNodeId"] = iter->nSrcNodeId.toString();
connect["SrcPort"] = iter->nSrcPort;
connect["SrcPortId"] = iter->nSrcPortId.toString();
connect["DestNodeId"] = iter->nDestNodeId.toString();
connect["DestPort"] = iter->nDestPort;
connect["DestPortId"] = iter->nDestPortId.toString();
arrConnect.append(connect);
}
obj["connections"] = arrConnect;
@ -216,13 +217,24 @@ void DrawingPanel::loadNodes(QJsonObject obj)
{
QJsonObject connect = connectJson.toObject();
QUuid srcId = QUuid(connect["SrcNodeId"].toString());
int srcPort = connect["SrcPort"].toInt();
QUuid srcPortId = QUuid(connect["SrcPortId"].toString());
QUuid destId = QUuid(connect["DestNodeId"].toString());
int destPort = connect["DestPort"].toInt();
QUuid destPortId = QUuid(connect["DestPortId"].toString());
if(_pModel)
PowerConnection* pCon = TopologyManager::instance().connection(srcPortId.toString(),destPortId.toString());
if(pCon)
{
_pModel->addConnectLline(srcId,destId,srcPort,destPort);
QString srcItemId = pCon->fromComponent();
QString destItemId = pCon->toComponent();
//todo:从拓扑结构中查找port的id
if(_pModel)
{
_pModel->addConnectLline(QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId);
}
}
else
{
//todo:提示拓扑结构已改变
}
}

View File

@ -88,9 +88,10 @@ bool FixedPortsModel::addNodeItem(QUuid uuid,GraphicsBaseItem* pItem)
void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos)
{
//todo:load图形时必有拓扑实体关联到对应的entity
BaseProperty* pro = nullptr;
GraphicsBaseItem* item = nullptr;
QMap<QUuid,BaseProperty*> mapData = TopologyManager::instance().getEntityData();
QMap<QUuid,BaseProperty*> mapData = TopologyManager::instance().getEntityData(); //加载的图形必定关联component(todo:完善判断条件,如判断拓扑节点)
if(mapData.contains(id))
{
pro = mapData[id];
@ -104,8 +105,19 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos)
}
else if(type == GIT_itemRect)
{
item = new ElectricSvgItemRect(QRect(-15, -15, 30, 30));
item = new ElectricSvgItemRect(QRect(-15, -15, 30, 30),false);
item->setItemType(GIT_itemRect);
QJsonArray portArr = pro->context()["port"].toArray();
for(QJsonValueRef portJson:portArr)
{
QJsonObject portObj = portJson.toObject();
QString portId = portObj["portId"].toString();
int x = portObj["x"].toInt();
int y = portObj["y"].toInt();
HandleType tye = HandleType(portObj["portType"].toInt());
PortPos locate = PortPos(portObj["locate"].toInt());
item->addPort(P_const,QPointF(x,y),portId,tye,locate);
}
}
else if(type == GIT_bus)
{
@ -116,10 +128,10 @@ void FixedPortsModel::addNodeItem(QUuid id/*,int type*/,QPointF pos)
for(QJsonValueRef portJson:portArr)
{
QJsonObject portObj = portJson.toObject();
int nPort = portObj["portId"].toInt();
QString portId = portObj["portId"].toString();
int x = portObj["x"].toInt();
int y = portObj["y"].toInt();
item->addPort(p_movable,nPort,QPointF(x,y));
item->addPort(p_movable,QPointF(x,y),portId);
}
}
if(item)
@ -184,23 +196,16 @@ void FixedPortsModel::loadNodeDataFromDataBase()
pData->setStation(info.station);
pData->setDataChanged(false);
if(info.type == GIT_itemTri)
{
PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,info.uuid.toString(),info.name); //首先load所有data和entity全局唯一
if(pEntity){
createTopoTerminalsByData(pEntity,info.context);
}
else if(info.type == GIT_itemRect)
{
//busStability bility = DataBase::GetInstance()->getBusStabilityById(info.id);
/*ElectricSvgItemRect_Property* pPro = dynamic_cast<ElectricSvgItemRect_Property*>(pData);
if(pPro)
{
}*/
}
else if(info.type == GIT_bus)
{
}
}
QList<topologicInfo> lstTopo = DataBase::GetInstance()->getAllTopologics();
for(auto &info:lstTopo)
{
TopologyManager::instance().createConnection(QString::number(info.id),info.pin_from.toString(),info.pin_to.toString(),info.uuid_from.toString(),info.uuid_to.toString());
}
_dataInitialised = true;
}
@ -213,7 +218,7 @@ void FixedPortsModel::loadNodeDataFromDataBase()
}
}
void FixedPortsModel::addConnectLline(QUuid srcId,QUuid destId,int srcPort,int destPort)
void FixedPortsModel::addConnectLline(QUuid srcId,QUuid destId,QUuid srcPort,QUuid destPort)
{
GraphicsBaseItem* src = _nodeItem[srcId];
GraphicsBaseItem* dest = _nodeItem[destId];
@ -224,27 +229,28 @@ void FixedPortsModel::addConnectLline(QUuid srcId,QUuid destId,int srcPort,int d
pItem->setItemType(GIT_link);
_scene->addItem(pItem);
ItemPort* ptSrc = src->getPortPtr(srcPort);
ItemPort* ptSrc = src->getPortById(srcPort.toString());
HandleType srcType = ptSrc->getType();
PortPos srcPos = ptSrc->portPos();
pItem->setStartPoint(ptSrc->scenePos());
ptSrc->setConnect(pItem);
ItemPort* ptDest = nullptr;
if(dest->getItemType() == GIT_bus) //母线动态创建port
ptDest = dest->getPortById(destPort.toString());
pItem->setEndPoint(ptDest->scenePos());
/*if(dest->getItemType() == GIT_bus) //母线动态创建port
{
ptDest = dest->getPortPtr(destPort);
ptDest = dest->getPortById(destPort.toString());
pItem->setEndPoint(ptDest->scenePos());
}
else
{
ptDest = dest->getPortPtr(destPort);
ptDest = dest->getPortById(destPort.toString());
pItem->setEndPoint(ptDest->scenePos());
}
}*/
if(ptDest != nullptr)
{
int destPort = ptDest->getTag();
HandleType destType = ptDest->getType();
PortPos destPos = ptDest->portPos();
@ -253,11 +259,6 @@ void FixedPortsModel::addConnectLline(QUuid srcId,QUuid destId,int srcPort,int d
ptDest->setConnect(pItem);
addNodeItem(pItem->itemId(),pItem);
/*auto srcParent = ptSrc->getParentPtr();
auto destParent = ptDest->getParentPtr();
srcParent->updateConnectData();
destParent->updateConnectData();*/
}
}
}
@ -432,7 +433,7 @@ QVariant FixedPortsModel::nodeData(QUuid nodeId, NodeRole role) const
return result;
}
QJsonObject FixedPortsModel::saveNode(QUuid const nodeId) const
/*QJsonObject FixedPortsModel::saveNode(QUuid const nodeId) const
{
QJsonObject nodeJson;
@ -450,7 +451,7 @@ QJsonObject FixedPortsModel::saveNode(QUuid const nodeId) const
}
return nodeJson;
}
}*/
void FixedPortsModel::saveNode(int nPageId)
{
@ -489,7 +490,31 @@ void FixedPortsModel::saveNode(int nPageId)
}
}
//todo:再循环一遍删除待删除项
//todo:增加判断,只在设置模式保存连接关系
QVector<Connection> vecCon = allConnections(); //保存当前页面中的连接关系
for(auto &con:vecCon)
{
QString fromPin = con.nSrcPortId.toString();
QString toPin = con.nDestPortId.toString();
PowerConnection* pCon = TopologyManager::instance().connection(fromPin,toPin);
if(pCon)
{
DataState state = pCon->state();
switch (state) {
case DataState::unchanged:
break;
case DataState::prepareDelete:
DataBase::GetInstance()->deleteTopologic(con.nSrcPortId,con.nDestPortId);
TopologyManager::instance().removeConnection(pCon->id());
break;
case DataState::changed:
DataBase::GetInstance()->insertTopologic(nPageId,con.nSrcNodeId,con.nDestNodeId,con.nSrcPortId,con.nDestPortId,0,"",0);
break;
default:
break;
}
}
}
}
void FixedPortsModel::onSignal_ifExits(QUuid id,const QString& str,int type,GraphicsBaseItem* pitem)
@ -550,7 +575,7 @@ void FixedPortsModel::onSignal_ifExits(QUuid id,const QString& str,int type,Grap
PowerEntity* pEntity = TopologyManager::instance().createEntity(EntityType::Component,id.toString(),str);
if(pEntity)
pitem->setEntity(pEntity);
createTopoTerminals(pitem); //创建item对象的逻辑接线点
createTopoTerminalsByItem(pitem); //创建item对象的逻辑接线点
}
}
@ -683,13 +708,13 @@ ConfigurationDiagram* FixedPortsModel::getTopologyDiagram()
return dynamic_cast<ConfigurationDiagram*>(_pEntity);
}
void FixedPortsModel::createTopoTerminals(GraphicsBaseItem* pItem)
void FixedPortsModel::createTopoTerminalsByItem(GraphicsBaseItem* pItem)
{
PowerEntity* pEntity = pItem->entity();
if(pEntity)
{
QMap<QString,ItemPort*> mapPorts = pItem->getPorts(); //创建对应
QMap<QString,ItemPort*> mapPorts = pItem->getPorts(); //创建实体port对应的拓扑port
for(auto &port:mapPorts)
{
TerminalType terType;
@ -713,6 +738,36 @@ void FixedPortsModel::createTopoTerminals(GraphicsBaseItem* pItem)
}
}
void FixedPortsModel::createTopoTerminalsByData(PowerEntity* pParent,QJsonObject componentCon)
{
QJsonArray portsArray = componentCon["port"].toArray();
for (QJsonValueRef portJson : portsArray) //每个属性的状态信息
{
QJsonObject node = portJson.toObject();
QString portId = node["portId"].toString();
int x = node["x"].toInt();
int y = node["y"].toInt();
PortPos locate = PortPos(node["locate"].toInt());
HandleType portType = HandleType(node["portType"].toInt());
TerminalType terType;
switch (portType) {
case T_lineIn:
terType = TerminalType::PowerInput;
break;
case T_lineOut:
terType = TerminalType::PowerOutput;
break;
case T_lineInOut:
terType = TerminalType::PowerConnect;
break;
default:
break;
}
TopologyManager::instance().createTerminal(pParent->id(),terType,"",QPointF(x,y),portId);
}
}
bool FixedPortsModel::isItemValid(GraphicsBaseItem* pItem)
{
BaseProperty* pData = pItem->getProperty();

View File

@ -6,7 +6,7 @@
#include <QSvgRenderer>
#include <QDebug>
ElectricSvgItem::ElectricSvgItem(const QRect &rect, QGraphicsItem *parent)
ElectricSvgItem::ElectricSvgItem(const QRect &rect, bool autoGenPort,QGraphicsItem *parent)
: GraphicsBaseItem(parent),m_pRender(nullptr)
{
m_lastBoudingRect = rect;

View File

@ -37,14 +37,14 @@ void ElectricSvgItemBus::updateConnectData()
{
for(auto ptr:m_mapPort)
{
if(ptr->connected())
//if(ptr->connected())
{
QJsonObject port;
port["portId"] = ptr->getId();
auto pLine = ptr->getConnectPtr();
//port["connectedItem"] = pLine->getOppositeId(m_itemId).toString();
port["x"] = ptr->pos().x();
port["y"] = ptr->pos().y();
port["portType"] = ptr->getType();
arr.push_back(port);
}
}

View File

@ -7,7 +7,7 @@
#include <QGraphicsScene>
#include <QGraphicsView>
ElectricSvgItemRect::ElectricSvgItemRect(const QRect &rect, QGraphicsItem *parent)
ElectricSvgItemRect::ElectricSvgItemRect(const QRect &rect, bool genNewPort, QGraphicsItem *parent)
: ElectricSvgItem(rect,parent)
{
loadSvg(":/images/element/svg_rect.svg");
@ -38,8 +38,11 @@ ElectricSvgItemRect::ElectricSvgItemRect(const QRect &rect, QGraphicsItem *paren
m_dRatioX = 0.5;
addPort(P_const,QPointF(boundingRect().right() - boundingRect().width() * m_dRatioX, boundingRect().top()),QUuid::createUuid().toString(),T_lineIn,P_top);
addPort(P_const,QPointF(boundingRect().right() - boundingRect().width() * m_dRatioX, boundingRect().bottom()),QUuid::createUuid().toString(),T_lineOut,P_down);
if(genNewPort)
{
addPort(P_const,QPointF(boundingRect().right() - boundingRect().width() * m_dRatioX, boundingRect().top()),QUuid::createUuid().toString(),T_lineIn,P_top);
addPort(P_const,QPointF(boundingRect().right() - boundingRect().width() * m_dRatioX, boundingRect().bottom()),QUuid::createUuid().toString(),T_lineOut,P_down);
}
qRegisterMetaType<PropertyInfo>("PropertyInfo"); //注册自定义数据类型
}

View File

@ -223,11 +223,11 @@ int GraphicsBaseItem::addPort(PortState typ,QPointF vec,QString id,HandleType hT
pPort->setPos(vec);
pPort->setParent(this);
m_mapPort.insert(QString::number(_portId++),pPort);
m_mapPort.insert(pPort->getId(),pPort);
return ntagId;
}
void GraphicsBaseItem::addPort(PortState typ,int ntagId,QPointF vec)
/*void GraphicsBaseItem::addPort(PortState typ,int ntagId,QPointF vec)
{
if(typ == p_movable)
{
@ -240,6 +240,17 @@ void GraphicsBaseItem::addPort(PortState typ,int ntagId,QPointF vec)
m_mapPort.insert(QString::number(_portId++),pPort);
}
}*/
ItemPort* GraphicsBaseItem::getPortById(QString id) const
{
for(auto iter:m_mapPort)
{
QString portId = iter->getId();
if(portId == id)
return iter;
}
return nullptr;
}
ItemPort* GraphicsBaseItem::getPortPtr(int n) const
@ -296,12 +307,15 @@ void GraphicsBaseItem::updateConnectData()
{
for(auto ptr:m_mapPort)
{
if(ptr->connected())
//if(ptr->connected())
{
QJsonObject port;
port["portId"] = ptr->getId();
auto pLine = ptr->getConnectPtr();
//port["connectedItem"] = pLine->getOppositeId(m_itemId).toString();
port["x"] = ptr->pos().x();
port["y"] = ptr->pos().y();
port["locate"] = ptr->portPos();
port["portType"] = ptr->getType();
arr.push_back(port);
}
}

View File

@ -1,9 +1,11 @@
#include <QMessageBox>
#include "itemPropertyDlg.h"
#include "propertyContentDlg.h"
#include "dataManager.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "ui_itemPropertyDlg.h"
#include <QMessageBox>
#include "baseContentDlg.h"
#include "baseInfoDlg.h"
ItemPropertyDlg::ItemPropertyDlg(QWidget *parent)
: QDialog(parent)
@ -89,7 +91,7 @@ void ItemPropertyDlg::onGroupSelected(const QString& str)
createGroupView(str);
}
PropertyContentDlg* pDlg = qobject_cast<PropertyContentDlg*>(groupViews_[str]);
BaseContentDlg* pDlg = qobject_cast<BaseContentDlg*>(groupViews_[str]);
if(pDlg)
{
QMap<QString,propertyStateInfo> valueMap;
@ -106,7 +108,18 @@ void ItemPropertyDlg::onGroupSelected(const QString& str)
void ItemPropertyDlg::createGroupView(const QString& str)
{
PropertyContentDlg* contentDlg = new PropertyContentDlg(ui->stackedWidget);
//todo:基础信息、间隔信息、动态界面在此分支
BaseContentDlg* contentDlg = nullptr;
if(str == QString("component") || str == QString::fromWCharArray(L"基本信息")){
contentDlg = new BaseInfoDlg(ui->stackedWidget);
}
else if(str == "bayInfo" || str == QString::fromWCharArray(L"间隔信息")){
}
else{
contentDlg = new PropertyContentDlg(ui->stackedWidget);
}
if(contentDlg)
{
contentDlg->createGroupView(groupInfo_[str]);

View File

@ -1,8 +1,8 @@
#include <QJsonObject>
#include "powerConnection.h"
PowerConnection::PowerConnection(const QString& uuid,const QString& fromTerminal, const QString& toTerminal, QObject* parent)
: QObject(parent),m_uuid(uuid), m_fromTerminal(fromTerminal), m_toTerminal(toTerminal) {}
PowerConnection::PowerConnection(const QString& uuid,const QString& fromTerminal, const QString& toTerminal,const QString& fromId,const QString& toId, QObject* parent)
: QObject(parent),m_uuid(uuid), m_fromTerminal(fromTerminal), m_toTerminal(toTerminal),m_fromComponent(fromId),m_toComponent(toId) {}
QJsonObject PowerConnection::toJson() const {
QJsonObject obj;

View File

@ -7,11 +7,8 @@
#include <QDateEdit>
PropertyContentDlg::PropertyContentDlg(QWidget *parent)
: QDialog(parent)
,_layout(nullptr)
: BaseContentDlg(parent)
{
setWindowFlags(Qt::Widget);
//this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
_layout = new QVBoxLayout(this);
}
@ -151,7 +148,7 @@ QWidget* PropertyContentDlg::createEditor(propertyStateInfo pro)
return pWidget;
}
QMap<QString,propertyStateInfo> PropertyContentDlg::getPropertyValue() const
QMap<QString,propertyStateInfo> PropertyContentDlg::getPropertyValue()
{
QMap<QString,propertyStateInfo> map;
@ -334,13 +331,3 @@ void PropertyContentDlg::setPropertyValue(QMap<QString,propertyStateInfo> map)
}
}
}
QFormLayout* PropertyContentDlg::createFormLayout(QWidget* parent)
{
QFormLayout* layout = new QFormLayout(parent);
layout->setHorizontalSpacing(20); // 标签与控件间距
layout->setVerticalSpacing(12); // 行间距
layout->setLabelAlignment(Qt::AlignRight); // 标签右对齐
layout->setContentsMargins(12, 12, 12, 12); // 内边距
return layout;
}

View File

@ -91,12 +91,12 @@ bool TopologyManager::deleteEntity(const QString& id)
}
PowerConnection* TopologyManager::createConnection(const QString& connId,const QString& fromId, const QString& toId)
PowerConnection* TopologyManager::createConnection(const QString& connId,const QString& fromTerId, const QString& toTerId,const QString& fromId,const QString& toId)
{
// 验证有效性
if (!m_allTerminals.contains(fromId) ||
!m_allTerminals.contains(toId) ||
fromId == toId)
if (!m_allTerminals.contains(fromTerId) ||
!m_allTerminals.contains(toTerId) ||
fromTerId == toTerId)
{
qWarning() << "Invalid connection endpoints";
return nullptr;
@ -104,20 +104,20 @@ PowerConnection* TopologyManager::createConnection(const QString& connId,const Q
// 防止重复连接
foreach (auto conn, m_connections) {
if (conn->fromTerminalId() == fromId &&
conn->toTerminalId() == toId)
if (conn->fromTerminalId() == fromTerId &&
conn->toTerminalId() == toTerId)
{
return conn; // 返回已存在的连接
}
}
// 创建新连接
PowerConnection* conn = new PowerConnection(connId,fromId, toId);
PowerConnection* conn = new PowerConnection(connId,fromTerId, toTerId,fromId,toId);
m_connections[connId] = conn;
// 更新索引
m_connectionIndex.insert(fromId, conn);
m_connectionIndex.insert(toId, conn);
m_connectionIndex.insert(fromTerId, conn);
m_connectionIndex.insert(toTerId, conn);
emit connectionCreated(connId);
return conn;
@ -217,7 +217,22 @@ PowerConnection* TopologyManager::connection(const QString& conId) const
return m_connections.value(conId,nullptr);
}
void TopologyManager::saveToDB(const QString& path)
PowerConnection* TopologyManager::connection(const QString& fromPin,const QString& toPin)
{
for(auto &con:m_connections)
{
if(con->fromTerminalId() == fromPin && con->toTerminalId() == toPin)
return con;
}
return nullptr;
}
QHash<QString,PowerConnection*> TopologyManager::getAllConnections()
{
return m_connections;
}
/*void TopologyManager::saveToDB(const QString& path)
{
QJsonObject root;
@ -242,9 +257,9 @@ void TopologyManager::saveToDB(const QString& path)
root["connections"] = connectionsArray;
//todo:写入到数据库
}
}*/
void TopologyManager::loadFromDB(const QString& path)
/*void TopologyManager::loadFromDB(const QString& path)
{
//todo::将读到的字为json
QString strJson;
@ -301,7 +316,7 @@ void TopologyManager::loadFromDB(const QString& path)
connObj["to"].toString()
);
}
}
}*/
PowerEntity* TopologyManager::getEntity(const QString& id) const
{
@ -324,9 +339,12 @@ PowerEntity* TopologyManager::createDiagram(const QString& id,const QString& nam
{
PowerEntity* entity = nullptr;
entity = new ConfigurationDiagram(id,name);
if(!m_diagrams.contains(id))
{
entity = new ConfigurationDiagram(id,name);
m_diagrams.insert(entity->id(), entity);
}
m_diagrams.insert(entity->id(), entity);
return entity;
}

View File

@ -3,6 +3,7 @@
#include <QGraphicsView>
#include <QDebug>
#include <QMimeData>
#include <QMessageBox>
#include "graphicsItem/graphicsBaseItem.h"
#include "graphicsItem/handleText.h"
#include "powerEntity.h"
@ -401,12 +402,22 @@ void BaseSelector::dropEvent(QGraphicsSceneDragDropEvent *event, DesignerScene*)
{
if (event->mimeData()->hasText()) {
QString text = event->mimeData()->text();
QString uuid = QString::fromLocal8Bit(event->mimeData()->data("application/id"));
// 根据拖拽的数据创建相应的图形项并添加到场景中
// 例如创建一个文本项
QGraphicsTextItem *textItem = new QGraphicsTextItem(text);
textItem->setPos(event->scenePos());
//addItem(textItem);
event->acceptProposedAction();
//根据data数据新增拖拽的item
QMap<QUuid,GraphicsBaseItem*> items = _model->allItems();
if(items.contains(QUuid(uuid))){
QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"此对象在当前页已存在"));
return;
}
else{
_model->addNodeItem(QUuid(uuid),event->scenePos());
}
}
}

View File

@ -116,7 +116,7 @@ void ConnectingSelector::createConnectLline(GraphicsBaseItem* connectingItem,Gra
pItem->setEndPoint(ptDest->scenePos());
}
_model->createTopoTerminals(touchedItem); //创建port时创建对应的terminal
_model->createTopoTerminalsByItem(touchedItem); //创建port时创建对应的terminal
}
else
{
@ -129,9 +129,13 @@ void ConnectingSelector::createConnectLline(GraphicsBaseItem* connectingItem,Gra
{
QString destPortId = ptDest->getId(); //port自身id
if(TopologyManager::instance().validateConnection(srcPortId,destPortId))
TopologyManager::instance().createConnection(uid.toString(),srcPortId,destPortId); //创建拓扑连接(逻辑)
if(TopologyManager::instance().validateConnection(srcPortId,destPortId)){
PowerConnection* pCon = TopologyManager::instance().createConnection(uid.toString(),srcPortId,destPortId,connectingItem->itemId().toString(),touchedItem->itemId().toString()); //创建拓扑连接(逻辑)
if(pCon)
pCon->setState(DataState::changed);
}
pItem->setConnection(Connection(connectingItem->itemId(),QUuid(srcPortId),ptSrc->getType(),ptSrc->portPos(),touchedItem->itemId(),QUuid(destPortId),ptDest->getType(),ptDest->portPos()));
_model->addNodeItem(pItem->itemId(),pItem);
auto srcParent = ptSrc->getParentPtr();
auto destParent = ptDest->getParentPtr();

View File

@ -0,0 +1,339 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>baseInfoDlg</class>
<widget class="QWidget" name="baseInfoDlg">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>736</width>
<height>620</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout" columnstretch="0,1,1,0,1,0,1,0,1,0,1">
<property name="leftMargin">
<number>10</number>
</property>
<property name="topMargin">
<number>10</number>
</property>
<property name="rightMargin">
<number>10</number>
</property>
<property name="bottomMargin">
<number>10</number>
</property>
<property name="horizontalSpacing">
<number>8</number>
</property>
<property name="verticalSpacing">
<number>10</number>
</property>
<item row="0" column="0" colspan="11">
<widget class="QLabel" name="label_title">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>30</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">border:4px double dark;</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>UUID</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="6">
<widget class="QLineEdit" name="le_uuid">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="7" rowspan="2" colspan="4">
<widget class="QWidget" name="widget" native="true">
<property name="styleSheet">
<string notr="true">border:2px dashed black;
border-radius:5px;</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>TAG</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QLineEdit" name="le_tag">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>命名空间</string>
</property>
</widget>
</item>
<item row="3" column="1" colspan="6">
<widget class="QLineEdit" name="le_nameSpace">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="7">
<widget class="QLabel" name="label_4">
<property name="text">
<string>名称</string>
</property>
</widget>
</item>
<item row="3" column="8" colspan="3">
<widget class="QLineEdit" name="le_name">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>标签</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QLineEdit" name="le_label">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QLabel" name="label_6">
<property name="text">
<string>注释</string>
</property>
</widget>
</item>
<item row="4" column="4" colspan="7">
<widget class="QLineEdit" name="le_description">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>电网</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QComboBox" name="cb_grid"/>
</item>
<item row="5" column="3">
<widget class="QLabel" name="label_8">
<property name="text">
<string>区域</string>
</property>
</widget>
</item>
<item row="5" column="4" colspan="3">
<widget class="QComboBox" name="cb_zone"/>
</item>
<item row="5" column="7">
<widget class="QLabel" name="label_9">
<property name="text">
<string>子站</string>
</property>
</widget>
</item>
<item row="5" column="8" colspan="3">
<widget class="QComboBox" name="cb_station"/>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>间隔名称</string>
</property>
</widget>
</item>
<item row="6" column="1" colspan="6">
<widget class="QLineEdit" name="le_nameSpace_2">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item row="6" column="7">
<widget class="QLabel" name="label_11">
<property name="text">
<string>序号</string>
</property>
</widget>
</item>
<item row="6" column="8">
<widget class="QLineEdit" name="le_idx_1">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item row="6" column="9">
<widget class="QLabel" name="label_12">
<property name="maximumSize">
<size>
<width>20</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>--</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="6" column="10">
<widget class="QLineEdit" name="le_idx_2">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>联结 从</string>
</property>
</widget>
</item>
<item row="7" column="1" colspan="4">
<widget class="QLineEdit" name="le_from">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item row="7" column="5">
<widget class="QLabel" name="label_14">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>到</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="7" column="6" colspan="5">
<widget class="QLineEdit" name="le_to">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>服役状态</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QRadioButton" name="rb_inService">
<property name="text">
<string>IN 服役中</string>
</property>
</widget>
</item>
<item row="8" column="2" colspan="2">
<widget class="QRadioButton" name="rb_outService">
<property name="text">
<string>OUT 服役外</string>
</property>
</widget>
</item>
<item row="8" column="7">
<widget class="QLabel" name="label_16">
<property name="text">
<string>状态</string>
</property>
</widget>
</item>
<item row="8" column="8" colspan="3">
<widget class="QLineEdit" name="le_to_2">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item row="9" column="1" colspan="10">
<widget class="QPushButton" name="pushButton">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string>设备库</string>
</property>
</widget>
</item>
<item row="10" column="1" colspan="10">
<widget class="QWidget" name="widget_runTime" native="true">
<property name="styleSheet">
<string notr="true">border:1px dashed black;</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>642</width>
<height>552</height>
<width>879</width>
<height>672</height>
</rect>
</property>
<property name="windowTitle">
@ -105,13 +105,13 @@
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>80</width>
<height>20</height>
<height>30</height>
</size>
</property>
<property name="font">
@ -132,13 +132,13 @@
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>80</width>
<height>20</height>
<height>30</height>
</size>
</property>
<property name="font">

View File

@ -3,6 +3,7 @@ project(diagramUtils)
set(DIAGRAMUTILS_HEADER_FILES
include/logger.h
include/dataManager.h
include/componentIconManager.h
../common/include/global.h
../common/include/compiler.hpp
../common/include/export.hpp
@ -13,6 +14,7 @@ set(DIAGRAMUTILS_SOURCE_FILES
source/logger.cpp
source/dataBase.cpp
source/dataManager.cpp
source/componentIconManager.cpp
../common/source/global.cpp
)

View File

@ -0,0 +1,26 @@
#ifndef COMPONENTICONMANAGER_H
#define COMPONENTICONMANAGER_H
#include <QObject>
#include "global.h"
#include "export.hpp"
/****图标管理类
*
*****/
class DIAGRAM_DESIGNER_PUBLIC ComponentIconManager : public QObject
{
Q_OBJECT
public:
explicit ComponentIconManager(QObject *parent = nullptr);
~ComponentIconManager();
static ComponentIconManager& instance();
public:
void initialData();
void addIcon(QString tpe,DiagramMode mode,VariantIcon varIcon,QString iconPath);
QString getIconPath(QString tpe,DiagramMode mode,VariantIcon varIcon);
private:
QMap<QString,QMap<DiagramMode,QMap<VariantIcon,QString>>> _mapIcon;
bool _init;
};
#endif // COMPONENTICONMANAGER_H

View File

@ -30,11 +30,16 @@ public:
bool insertStation(int zoneId,QString name,QString description,bool isLocal,int op);
bool insertGrid(QString name,QString description,int op);
bool insertZone(int grid_id,QString name,QString description,int op);
bool insertTopologic(int page_id,QUuid uuid_from,QUuid uuid_to,int flag,QString description,int op);
bool insertTopologic(int page_id,QUuid uuid_from,QUuid uuid_to,QUuid pin_from,QUuid pin_to,int flag,QString description,int op);
bool insertBus_stability(int componentId,double resistance,bool anchor_v,double uv_alarm,double ov_alarm,bool anchor_i,double ui_alarm,double oi_alarm,int op);
bool updateBus_stability(int componentId,double resistance,bool anchor_v,double uv_alarm,double ov_alarm,bool anchor_i,double ui_alarm,double oi_alarm,int op);
busStability getBusStabilityById(int componentId);
QString getGridNameById(int);
QString getZoneNameById(int);
QString getStationNameById(int);
QList<topologicInfo> getAllTopologics();
int topologicExist(QUuid fromPin,QUuid toPin);
topologicInfo getTopologicById(int id);
bool deleteTopologic(QUuid fromPin,QUuid toPin);
/*********************************************************************************/
bool updateComponent(QUuid uuid,QString tag,QString name,QJsonObject context);
bool insertComponent(QUuid uuid,QString modelName,QString nspath,QString tag,QString name,QString description,QString grid,QString zone,QString station,int type,bool inService,int state,QJsonObject connected_bus,QJsonObject label,QJsonObject context,int page_id,int op);
@ -49,7 +54,7 @@ public:
int getPageIdByName(QString name);
bool updatePage(QString tag,QString name,QJsonObject context);
QJsonObject getPageContextByName(QString name);
QStringList getAllPage();
QList<pageInfo> getAllPage();
/*********************************************************************************/
bool deleteComponentById(int id);
void select();

View File

@ -0,0 +1,45 @@
#include "componentIconManager.h"
ComponentIconManager& ComponentIconManager::instance()
{
//采用静态局部变量的方式,静态局部变量的初始化是在第一次访问时,以后的调用不会多次初始化,并且生命周期和程序一致
static ComponentIconManager instance;
return instance;
}
ComponentIconManager::ComponentIconManager(QObject *parent)
: QObject(parent)
{
_init = false;
initialData();
}
ComponentIconManager::~ComponentIconManager()
{
}
void ComponentIconManager::initialData()
{
addIcon("circuitBreaker",DM_edit,VI_thumbnail,"abcde");
}
void ComponentIconManager::addIcon(QString sType,DiagramMode mode,VariantIcon varIcon, QString iconPath)
{
_mapIcon[sType][mode][varIcon] = iconPath;
}
QString ComponentIconManager::getIconPath(QString tpe,DiagramMode mode,VariantIcon varIcon)
{
if(_mapIcon.contains(tpe))
{
if(_mapIcon[tpe].contains(mode))
{
if(_mapIcon[tpe][mode].contains(varIcon))
{
return _mapIcon[tpe][mode][varIcon];
}
}
}
return QString();
}

View File

@ -457,82 +457,23 @@ bool DataBase::insertZone(int grid_id,QString name,QString description,int op)
return false;
}
bool DataBase::insertTopologic(int page_id,QUuid uuid_from,QUuid uuid_to,int flag,QString description,int op)
bool DataBase::insertTopologic(int page_id,QUuid uuid_from,QUuid uuid_to,QUuid pin_from,QUuid pin_to,int flag,QString description,int op)
{
if(db.open())
{
QSqlQuery qry(db);
qry.prepare("INSERT INTO topologic(page_id, uuid_from, uuid_to, flag, description, op, ts) VALUES (?, ?, ?, ?, ?, ?, ?);");
qry.prepare("INSERT INTO topologic(page_id, uuid_from, uuid_to, pin_from, pin_to, flag, description, op, ts) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);");
qry.bindValue(0,page_id);
qry.bindValue(1,uuid_from);
qry.bindValue(2,uuid_to);
qry.bindValue(3,flag);
qry.bindValue(4,description);
qry.bindValue(5,op);
qry.bindValue(6,QDateTime::currentDateTime());
bool res = qry.exec();
QString str = qry.lastQuery();
if(!res)
{
qDebug()<<str<<"\n"<<qry.lastError().text();
}
qry.clear();
return res;
}
else
return false;
}
bool DataBase::insertBus_stability(int componentId,double resistance,bool anchor_v,double uv_alarm,double ov_alarm,bool anchor_i,double ui_alarm,double oi_alarm,int op)
{
if(db.open())
{
QSqlQuery qry(db);
qry.prepare("INSERT INTO bus_stability(component_id, resistance, anchor_v, uv_alarm, ov_alarm, anchor_i, ui_alarm, oi_alarm, op, ts) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
qry.bindValue(0,componentId);
qry.bindValue(1,resistance);
qry.bindValue(2,anchor_v);
qry.bindValue(3,uv_alarm);
qry.bindValue(4,ov_alarm);
qry.bindValue(5,anchor_i);
qry.bindValue(6,ui_alarm);
qry.bindValue(7,oi_alarm);
qry.bindValue(8,op);
qry.bindValue(9,QDateTime::currentDateTime());
bool res = qry.exec();
QString str = qry.lastQuery();
if(!res)
{
qDebug()<<str<<"\n"<<qry.lastError().text();
}
}
return false;
}
bool DataBase::updateBus_stability(int componentId,double resistance,bool anchor_v,double uv_alarm,double ov_alarm,bool anchor_i,double ui_alarm,double oi_alarm,int op)
{
if(db.open())
{
QSqlQuery qry(db);
qry.prepare("UPDATE bus_stability SET resistance=?, anchor_v=?, uv_alarm=?, ov_alarm=?, anchor_i=?, ui_alarm=?, oi_alarm=?, op=?, ts=? WHERE component_id=?");
qry.bindValue(0,resistance);
qry.bindValue(1,anchor_v);
qry.bindValue(2,uv_alarm);
qry.bindValue(3,ov_alarm);
qry.bindValue(4,anchor_i);
qry.bindValue(5,ui_alarm);
qry.bindValue(6,oi_alarm);
qry.bindValue(3,pin_from);
qry.bindValue(4,pin_to);
qry.bindValue(5,flag);
qry.bindValue(6,description);
qry.bindValue(7,op);
qry.bindValue(8,QDateTime::currentDateTime());
qry.bindValue(9,componentId);
bool res = qry.exec();
QString str = qry.lastQuery();
const QVariantList list = qry.boundValues();
for (qsizetype i = 0; i < list.size(); ++i)
qDebug() << i << ":" << list.at(i).toString();
if(!res)
{
qDebug()<<str<<"\n"<<qry.lastError().text();
@ -544,42 +485,176 @@ bool DataBase::updateBus_stability(int componentId,double resistance,bool anchor
return false;
}
busStability DataBase::getBusStabilityById(int componentId)
QString DataBase::getGridNameById(int id)
{
busStability inf;
if(db.open())
{
QSqlQuery qry(db);
QString sName;
QString strSQL = "SELECT name FROM grid WHERE id = ?";
QVariantList params;
params.append(id);
//qry.prepare("SELECT * FROM component WHERE global_uuid = ?");
qry.prepare("SELECT id, component_id, resistance, anchor_v, uv_alarm, ov_alarm, anchor_i, ui_alarm, oi_alarm, op FROM bus_stability WHERE component_id = ?");
qry.bindValue(0,componentId);
bool res = qry.exec();
QString str = qry.lastQuery();
if(!res)
try
{
QSqlQuery query = executeSQL(strSQL,false,params);
while (query.next())
{
qDebug()<<str<<"\n"<<qry.lastError().text();
qry.clear();
}
else
{
while (qry.next())
{
int id = qry.value(0).toInt();
inf.componentId = qry.value(1).toInt();
inf.resistance = qry.value(2).toDouble();
inf.anchor_v = qry.value(3).toBool();
inf.uv_alarm = qry.value(4).toDouble();
inf.ov_alarm = qry.value(5).toDouble();
inf.anchor_i = qry.value(6).toBool();
inf.ui_alarm = qry.value(7).toDouble();
inf.oi_alarm = qry.value(8).toDouble();
qry.clear();
}
sName = query.value(0).toString();
}
query.clear();
return sName;
}
catch (const std::exception& e)
{
return sName;
}
return inf;
}
QString DataBase::getZoneNameById(int id)
{
QString sName;
QString strSQL = "SELECT name FROM zone WHERE id = ?";
QVariantList params;
params.append(id);
try
{
QSqlQuery query = executeSQL(strSQL,false,params);
while (query.next())
{
sName = query.value(0).toString();
}
query.clear();
return sName;
}
catch (const std::exception& e)
{
return sName;
}
}
QString DataBase::getStationNameById(int id)
{
QString sName;
QString strSQL = "SELECT name FROM station WHERE id = ?";
QVariantList params;
params.append(id);
try
{
QSqlQuery query = executeSQL(strSQL,false,params);
while (query.next())
{
sName = query.value(0).toString();
}
query.clear();
return sName;
}
catch (const std::exception& e)
{
return sName;
}
}
QList<topologicInfo> DataBase::getAllTopologics()
{
QList<topologicInfo> lst;
QString strSQL = "SELECT id,uuid_from,uuid_to,pin_from,pin_to,flag FROM topologic";
try
{
QSqlQuery query = executeSQL(strSQL);
while (query.next())
{
topologicInfo info;
info.id = query.value(0).toInt();
info.uuid_from = QUuid(query.value(1).toString());
info.uuid_to = QUuid(query.value(2).toString());
info.pin_from = QUuid(query.value(3).toString());
info.pin_to = QUuid(query.value(4).toString());
info.flag = query.value(5).toInt();
lst.append(info);
}
query.clear();
return lst;
}
catch (const std::exception& e)
{
return lst;
}
}
int DataBase::topologicExist(QUuid fromPin,QUuid toPin)
{
QString strSQL = "SELECT id FROM topologic WHERE pin_from = ? AND pin_to = ?";
QVariantList params;
params.append(fromPin.toString());
params.append(toPin.toString());
try
{
QSqlQuery query = executeSQL(strSQL,false,params);
while (query.next())
{
int id = query.value(0).toInt();
return id;
}
query.clear();
return -1;
}
catch (const std::exception& e)
{
return -1;
}
}
topologicInfo DataBase::getTopologicById(int id)
{
topologicInfo info;
QString strSQL = "SELECT id,uuid_from,uuid_to,pin_from,pin_to,flag FROM topologic WHERE id = ?";
QVariantList params;
params.append(id);
try
{
QSqlQuery query = executeSQL(strSQL);
while (query.next())
{
info.id = query.value(0).toInt();
info.uuid_from = QUuid(query.value(1).toString());
info.uuid_to = QUuid(query.value(2).toString());
info.pin_from = QUuid(query.value(3).toString());
info.pin_to = QUuid(query.value(4).toString());
info.flag = query.value(5).toInt();
}
query.clear();
return info;
}
catch (const std::exception& e)
{
return info;
}
}
bool DataBase::deleteTopologic(QUuid fromPin,QUuid toPin)
{
QString strSQL = "DELETE FROM topologic WHERE pin_from = ? AND pin_to = ?";
QVariantList params;
params.append(fromPin.toString());
params.append(toPin.toString());
try
{
executeSQL(strSQL,false,params);
LOG_INFO("DB", QString("Delete topologic from:%1 to:%2 success").arg(fromPin.toString(),toPin.toString()));
return true;
}
catch (const std::exception& e)
{
LOG_ERROR("DB", QString("Delete topologic from:%1 to:%2 fail").arg(fromPin.toString(),toPin.toString()));
return false;
}
}
/************************************************************/
componentInfo DataBase::getComponentInfoByUuid(QString uuid)
{
@ -805,33 +880,37 @@ QJsonObject DataBase::getPageContextByName(QString name)
return QJsonObject();
}
QStringList DataBase::getAllPage()
QList<pageInfo> DataBase::getAllPage()
{
if(db.open())
QList<pageInfo> lst;
QString strSQL = "SELECT id,tag,name,status,label,context,description,op FROM page";
try
{
QSqlQuery qry(db);
qry.prepare("SELECT tag FROM page");
bool res = qry.exec();
if(!res)
QSqlQuery query = executeSQL(strSQL);
while (query.next())
{
qDebug()<<qry.lastError().text();
qry.clear();
return QStringList();
}
else
{
QStringList lst;
while (qry.next())
{
QString name = qry.value(0).toString();
lst.append(name);
}
qry.clear();
return lst;
pageInfo info;
info.id = query.value(0).toInt();
info.tag = query.value(1).toString();
info.name = query.value(2).toString();
info.status = query.value(3).toInt();
QString label = query.value(4).toString();
info.label = QstringToJson(label);
QString context = query.value(5).toString();
info.context = QstringToJson(context);
info.description = query.value(6).toString();
info.op = query.value(7).toInt();
lst.append(info);
}
query.clear();
return lst;
}
catch (const std::exception& e)
{
return lst;
}
else
return QStringList();
}
bool DataBase::deleteComponentById(int id)

View File

@ -31,6 +31,9 @@ public slots:
private:
Ui::diagramView *ui;
QStandardItemModel* _pModel;
int _count;
private:
QString generateName();
};
#endif

View File

@ -1,10 +1,11 @@
#include "diagramView.h"
#include "ui_diagramView.h"
#include "tools.h"
#include <QStandardItemModel>
#include <QMenu>
#include <QUuid>
#include "diagramView.h"
#include "ui_diagramView.h"
#include "tools.h"
#include "topologyManager.h"
#include "dataBase.h"
DiagramView::DiagramView(QWidget *parent)
: QDialog(parent)
@ -14,6 +15,7 @@ DiagramView::DiagramView(QWidget *parent)
ui->setupUi(this);
_pModel = new QStandardItemModel(this);
ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
_count = 0;
}
DiagramView::~DiagramView()
@ -30,6 +32,16 @@ void DiagramView::initial()
// 设置模型的列数
_pModel->setColumnCount(1);
QList<QStandardItem*> pageList;
QList<pageInfo> lst = DataBase::GetInstance()->getAllPage();
for(auto info:lst)
{
QStandardItem* pItem = new QStandardItem(info.name);
pItem->setData(info.id,Qt::UserRole);
pageList.append(pItem);
}
_pModel->appendRow(pageList);
// 创建树视图
ui->treeView->setModel(_pModel);
@ -51,15 +63,16 @@ void DiagramView::onIndexRbtnClicked(const QPoint &pos)
QModelIndex index = ui->treeView->indexAt(pos);
if (!index.isValid()) {
// 如果点击的是空白区域,创建新组态图菜单
int nCount = _pModel->invisibleRootItem()->rowCount();
QAction *addAction = new QAction("添加组态图", this);
connect(addAction,&QAction::triggered,this,[&](){
QVariant id = QUuid::createUuid();
QString sName = QString::fromWCharArray(L"组态图_")+QString::number(nCount);
QStandardItem *gridItem = new QStandardItem(sName);
gridItem->setData(id,Qt::UserRole+1);
_pModel->appendRow(gridItem);
QString sName = generateName();
QStandardItem *item = new QStandardItem(sName);
item->setData(id,Qt::UserRole+1);
_pModel->appendRow(item);
DiagramInfo info;
//todo:具体信息
@ -77,15 +90,15 @@ void DiagramView::onIndexRbtnClicked(const QPoint &pos)
if(item)
{
int nCount = item->rowCount();
QAction *addAction = new QAction("添加子组态图", this);
connect(addAction,&QAction::triggered,this,[&](){
QVariant id = QUuid::createUuid();
QString sName = item->text()+"_"+QString::number(nCount);
QStandardItem *gridItem = new QStandardItem(sName);
gridItem->setData(id,Qt::UserRole+1);
item->appendRow(gridItem);
QString sName = generateName();
QStandardItem *item = new QStandardItem(sName);
item->setData(id,Qt::UserRole+1);
item->appendRow(item);
DiagramInfo info;
//todo:具体信息
@ -137,19 +150,38 @@ void DiagramView::onIndexRbtnClicked(const QPoint &pos)
void DiagramView::onItemChanged(QStandardItem *item)
{
int nLevel = getLevel(item);
QString str = item->text();
QString str = item->text(); //名称可能修改
DiagramInfo info;
//todo:具体信息
info.id = item->data(Qt::UserRole).toInt();
info.sName = str;
emit diagramChange(info);
}
void DiagramView::onItemClicked(const QModelIndex &index)
{
QStandardItem* item = _pModel->itemFromIndex(index);
QStandardItem* parent = item->parent();
if(item)
{
DiagramInfo info;
//todo:具体信息
info.id = item->data(Qt::UserRole).toInt();
info.sName = item->text();
if(parent)
info.parentId = parent->data(Qt::UserRole).toInt();
emit diagramSelected(info);
}
}
QString DiagramView::generateName()
{
QString sName = QString::fromWCharArray(L"组态图_")+QString::number(_count);
QModelIndex Idx = findIndex(_pModel,sName);
if(Idx.isValid()) //已存在
{
_count += 1;
return generateName();
}
else {
return sName;
}
}

View File

@ -44,10 +44,10 @@ void LoadPageDlg::updateList()
itemRoot->appendRow(itemPage);
QList<QStandardItem*> pageList;
QStringList lst = DataBase::GetInstance()->getAllPage();
for(auto name:lst)
QList<pageInfo> lst = DataBase::GetInstance()->getAllPage();
for(auto info:lst)
{
pageList.append(new QStandardItem(name));
pageList.append(new QStandardItem(info.name));
}
itemPage->appendRows(pageList);
}

View File

@ -1582,7 +1582,7 @@ int projectModelDlg::createPropertyTable(const QString& sProject,const QString&
QStringList fields;
fields.append("id SERIAL NOT NULL PRIMARY KEY");
fields.append("global_uuid uuid NOT NULL DEFAULT gen_random_uuid()");
fields.append("attribute_group VARCHAR(64) NOT NULL");
//fields.append("attribute_group VARCHAR(64) NOT NULL");
for(auto &item:lstSelect)
{

View File

@ -24,6 +24,8 @@ void TopologyTree::mouseMoveEvent(QMouseEvent *event)
// 创建QMimeData并将选中项的文本放入
QMimeData *mimeData = new QMimeData();
mimeData->setText(model()->data(index, Qt::DisplayRole).toString());
QString id = index.data(Qt::UserRole).toString();
mimeData->setData("application/id",id.toLocal8Bit());
// 创建拖拽对象
QDrag *drag = new QDrag(this);

View File

@ -2,6 +2,7 @@
#include "ui_topologyView.h"
#include "tools.h"
#include "topologyTree.h"
#include "dataBase.h"
#include <QStandardItemModel>
#include <QMenu>
#include <QUuid>
@ -43,6 +44,62 @@ void TopologyView::initial()
rootItem->setFlags(rootItem->flags() & ~Qt::ItemIsEditable);
_pModel->appendRow(rootItem);
QList<componentInfo> lst= DataBase::GetInstance()->getAllComponents();
for(auto &info:lst)
{
QString nG= info.grid;
QString nZ = info.zone;
QString nS= info.station;
QString sGrid = DataBase::GetInstance()->getGridNameById(nG.toInt());
QString sZone = DataBase::GetInstance()->getZoneNameById(nZ.toInt());
QString sStation = DataBase::GetInstance()->getStationNameById(nS.toInt());
QModelIndex iG = findIndex(_pModel,sGrid);
QModelIndex iZ = findIndex(_pModel,sZone);
QModelIndex iS = findIndex(_pModel,sStation);
QStandardItem *pItem = new QStandardItem(info.tag);
pItem->setData(info.uuid,Qt::UserRole);
if(iG.isValid()) //已创建
{
QStandardItem* itemGrid = _pModel->itemFromIndex(iG);
if(iZ.isValid())
{
QStandardItem* itemZone = _pModel->itemFromIndex(iZ);
if(iS.isValid())
{
QStandardItem* itemStation = _pModel->itemFromIndex(iS);
itemStation->appendRow(pItem);
}
else
{
QStandardItem* itemStation = new QStandardItem(sStation);
itemStation->appendRow(pItem);
itemZone->appendRow(itemStation);
}
}
else
{
QStandardItem* itemZone = new QStandardItem(sZone);
QStandardItem* itemStation = new QStandardItem(sStation);
itemStation->appendRow(pItem);
itemZone->appendRow(itemStation);
itemGrid->appendRow(itemZone);
}
}
else
{
QStandardItem* itemGrid = new QStandardItem(sGrid);
QStandardItem* itemZone = new QStandardItem(sZone);
QStandardItem* itemStation = new QStandardItem(sStation);
itemStation->appendRow(pItem);
itemZone->appendRow(itemStation);
itemGrid->appendRow(itemZone);
rootItem->appendRow(itemGrid);
}
}
// 创建树视图
_treeView->setModel(_pModel);