#include "topologyView.h" #include "ui_topologyView.h" #include "tools.h" #include "topologyTree.h" #include "dataBase.h" #include "basePropertyManager.h" #include "baseProperty.h" #include #include #include TopologyView::TopologyView(QWidget *parent) : QDialog(parent) , ui(new Ui::topologyView) ,_pModel(nullptr) ,_treeView(nullptr) { ui->setupUi(this); //setWindowFlags(windowFlags() | Qt::WindowMinMaxButtonsHint&Qt::WindowCloseButtonHint); _pModel = new QStandardItemModel(this); _treeView = new TopologyTree(this); ui->verticalLayout->addWidget(_treeView); _treeView->setContextMenuPolicy(Qt::CustomContextMenu); } TopologyView::~TopologyView() { delete ui; } void TopologyView::initial() { connect(_treeView, &QTreeView::customContextMenuRequested, this, &TopologyView::onIndexRbtnClicked); connect(_treeView, &QTreeView::clicked, this, &TopologyView::onItemClicked); connect(_pModel, &QStandardItemModel::itemChanged, this, &TopologyView::onItemChanged); connect(&BasePropertyManager::instance(),&BasePropertyManager::dataChanged,this,&TopologyView::onDataChanged); _treeView->setHeaderHidden(true); // 设置模型的列数 _pModel->setColumnCount(1); // 设置模型的标题 //_pModel->setHeaderData(0, Qt::Horizontal, QObject::tr("层级")); QStandardItem *rootItem = _pModel->invisibleRootItem(); QList 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()); QString sGrid = nG; //暂时不使用id查找名称 QString sZone = nZ; QString sStation = nS; if(info.name.isEmpty()) continue; QStandardItem *pItem = new QStandardItem(info.name); pItem->setData(info.uuid.toString(),Qt::UserRole); addItemToView(sGrid,sZone,sStation,rootItem,pItem); } // 创建树视图 _treeView->setModel(_pModel); // 展开所有节点 _treeView->expandAll(); // 显示树视图 _treeView->setWindowTitle(QObject::tr("拓扑树")); } void TopologyView::loadTopologyFromDB() { } void TopologyView::onIndexRbtnClicked(const QPoint &pos) { // 获取当前点击的位置对应的索引 QModelIndex index = _treeView->indexAt(pos); if (!index.isValid()) { return; // 如果点击的是空白区域,直接返回 } QMenu menu; QStandardItem* item = _pModel->itemFromIndex(index); if(item) { int nCount = item->rowCount(); int nLevel = getLevel(item); if(nLevel == -1) //根节点 { QAction *addAction = new QAction("添加电网", this); connect(addAction,&QAction::triggered,this,[&](){ QString uuid = QUuid::createUuid().toString(); QStandardItem *gridItem = new QStandardItem(QString("电网_")+QString::number(nCount)); gridItem->setData(uuid,Qt::UserRole+1); gridItem->setData(int(EntityType::Grid),Qt::UserRole+2); item->appendRow(gridItem); EntityInfo info; info.eType = EntityType::Grid; info.sName = gridItem->text(); info.sUuid = uuid; emit entityCreate(info); }); menu.addAction(addAction); } else if(nLevel == 1) //grid { QAction *addAction = new QAction("添加区域", this); QString sParentid = item->data(Qt::UserRole+1).toString(); connect(addAction,&QAction::triggered,this,[&](){ QString uuid = QUuid::createUuid().toString(); QStandardItem *zoneItem = new QStandardItem(QString("区域_")+QString::number(nCount)); zoneItem->setData(uuid,Qt::UserRole+1); zoneItem->setData(int(EntityType::Zone),Qt::UserRole+2); item->appendRow(zoneItem); EntityInfo info; info.eType = EntityType::Zone; info.sName = zoneItem->text(); info.sParentId = sParentid; info.sUuid = uuid; emit entityCreate(info); _treeView->expandAll(); }); menu.addAction(addAction); } else if(nLevel == 2) //zone { QAction *addAction = new QAction("添加场站", this); QString sParentid = item->data(Qt::UserRole+1).toString(); connect(addAction,&QAction::triggered,this,[&](){ QString uuid = QUuid::createUuid().toString(); QStandardItem *stationItem = new QStandardItem(QString("场站_")+QString::number(nCount)); stationItem->setData(uuid,Qt::UserRole+1); stationItem->setData(int(EntityType::Station),Qt::UserRole+2); item->appendRow(stationItem); EntityInfo info; info.eType = EntityType::Station; info.sName = stationItem->text(); info.sUuid = uuid; info.sParentId = sParentid; emit entityCreate(info); _treeView->expandAll(); }); menu.addAction(addAction); } if(nLevel != -1) //除了根节点其余都能删除 { QAction *delAction = new QAction("删除", this); connect(delAction,&QAction::triggered,this,[&](){ QModelIndex currentIndex = _treeView->currentIndex(); if(currentIndex.isValid()) { QStandardItem* pItem = _pModel->itemFromIndex(currentIndex); if(pItem) { QString str = item->text(); EntityInfo info; info.sName = str; info.sUuid = item->data(Qt::UserRole+1).toString(); info.eType = EntityType(item->data(Qt::UserRole+2).toInt()); emit entityDelete(info); QStandardItem* pParent = item->parent(); if(pParent) { pParent->removeRow(currentIndex.row()); } } } }); menu.addAction(delAction); } } // 在点击位置显示菜单 menu.exec(_treeView->mapToGlobal(pos)); } void TopologyView::onItemChanged(QStandardItem *item) { int nLevel = getLevel(item); QString str = item->text(); EntityInfo info; info.sName = str; info.sUuid = item->data(Qt::UserRole+1).toString(); info.eType = EntityType(item->data(Qt::UserRole+2).toInt()); emit entityChange(info); } void TopologyView::onItemClicked(const QModelIndex &index) { QStandardItem* item = _pModel->itemFromIndex(index); if(item) { EntityType type = EntityType(item->data(Qt::UserRole+2).toInt()); if(type == EntityType::ConfigurationDiagram) { EntityInfo info; info.eType = EntityType::ConfigurationDiagram; info.sName = item->text(); info.sUuid = item->data(Qt::UserRole+1).toString(); info.sParentId = item->parent()->data(Qt::UserRole+1).toString(); emit entitySelected(info); } } } void TopologyView::onDataCreated(QString uuid) { } void TopologyView::onDataChanged(QString uuid) { QModelIndex itemIndex = findIndex(_pModel,uuid,Qt::UserRole); BaseProperty* pData = BasePropertyManager::instance().findEntityData(QUuid(uuid)); if(pData) { if(itemIndex.isValid()) //已存在 { QStandardItem *pItem = _pModel->itemFromIndex(itemIndex); if(pItem) { if(pItem->text() != pData->tag()) //已改名 { pItem->setText(pData->tag()); } QString sStation = pItem->parent()->text(); QString sZone = pItem->parent()->parent()->text(); QString sGrid = pItem->parent()->parent()->parent()->text(); if(sStation == pData->station() && sZone == pData->zone() && sGrid == pData->grid()) //从属关系未变 { } else { QStandardItem* item = _pModel->takeItem(pItem->row()); //从原层级中取出,添加到新的层级 addItemToView(pData->grid(),pData->zone(),pData->station(),_pModel->invisibleRootItem(),item); } } } else { QStandardItem *pItem = new QStandardItem(pData->tag()); pItem->setData(uuid,Qt::UserRole); addItemToView(pData->grid(),pData->zone(),pData->station(),_pModel->invisibleRootItem(),pItem); } } } void TopologyView::addItemToView(QString sGrid,QString sZone,QString sStation,QStandardItem *root,QStandardItem *pItem) { QModelIndex iG; QModelIndex iZ; QModelIndex iS; iG = findIndex(_pModel, sGrid, Qt::DisplayRole, QModelIndex()); if (iG.isValid()) { iZ = findIndex(_pModel, sZone, Qt::DisplayRole, iG); // 只在Grid下查找 if (iZ.isValid()) { iS = findIndex(_pModel, sStation, Qt::DisplayRole, iZ); // 只在Zone下查找 } } 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); root->appendRow(itemGrid); } }