From 04dd9af60ec12e641ef677d063d40c27c54da8df Mon Sep 17 00:00:00 2001 From: baiYue Date: Tue, 29 Jul 2025 20:15:18 +0800 Subject: [PATCH] add diagram wizard bay setting ui --- common/include/global.h | 10 +- diagramCavas/CMakeLists.txt | 3 + .../diagramEditor/diagramEditorBaseBlock.h | 2 +- .../diagramEditorBaySettingDlg.h | 40 +++ .../diagramEditor/diagramEditorWizard.h | 21 +- .../diagramEditor/wizardBayContentDlg.h | 11 +- .../diagramEditor/diagramEditorBaseBlock.cpp | 9 +- .../diagramEditorBaySettingDlg.cpp | 174 +++++++++++ .../diagramEditor/diagramEditorWizard.cpp | 130 +++++++- .../diagramEditor/wizardBayContentDlg.cpp | 122 +++++++- diagramCavas/ui/diagramEditorBaySettingDlg.ui | 293 ++++++++++++++++++ 11 files changed, 800 insertions(+), 15 deletions(-) create mode 100644 diagramCavas/include/diagramEditor/diagramEditorBaySettingDlg.h create mode 100644 diagramCavas/source/diagramEditor/diagramEditorBaySettingDlg.cpp create mode 100644 diagramCavas/ui/diagramEditorBaySettingDlg.ui diff --git a/common/include/global.h b/common/include/global.h index 52068aa..6d57025 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -397,6 +397,7 @@ struct DiagramEditorWizardBusInfo //组态编辑母线信息 int nNum1 = 0; //1母 int nNum2 = 0; //2母 int connectType = 0; //接线方式,1为分段连接 + bool bChanged = false; //是否改变 }; enum class BayType //间隔类型 @@ -411,7 +412,6 @@ enum class BayType //间隔类型 mainTransformerBay //主变 }; - struct DiagramEditorWizardBayInfo //组态间隔信息 { QString sName; @@ -445,6 +445,14 @@ struct DiagramEditorBriefConnect //组态编辑时连接信息 else return false; } + + QString getOppositeName(const QString& s){ //获取另一端名称 + if(con1.sName == s) + return con2.sName; + else if(con2.sName == s) + return con1.sName; + return QString(); + } }; //==================组态图使用===================== diff --git a/diagramCavas/CMakeLists.txt b/diagramCavas/CMakeLists.txt index 0cf7331..942323d 100644 --- a/diagramCavas/CMakeLists.txt +++ b/diagramCavas/CMakeLists.txt @@ -37,6 +37,7 @@ set(DIAGRAMCAVAS_HEADER_FILES include/diagramEditor/wizardBayContentDlg.h include/diagramEditor/diagramEditorBaseBlock.h include/diagramEditor/diagramEditorStructContainer.h + include/diagramEditor/diagramEditorBaySettingDlg.h include/graphicsDataModel/baseModel.h include/graphicsDataModel/fixedPortsModel.h include/graphicsItem/electricConnectLineItem.h @@ -111,6 +112,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES source/diagramEditor/wizardBayContentDlg.cpp source/diagramEditor/diagramEditorBaseBlock.cpp source/diagramEditor/diagramEditorStructContainer.cpp + source/diagramEditor/diagramEditorBaySettingDlg.cpp source/graphicsDataModel/baseModel.cpp source/graphicsDataModel/fixedPortsModel.cpp source/graphicsItem/electricConnectLineItem.cpp @@ -160,6 +162,7 @@ set(UI_FILES ui/measureSettingDlg.ui ui/bayManagerDlg.ui ui/bayManagerContentDlg.ui + ui/diagramEditorBaySettingDlg.ui ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) diff --git a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h index b3d91ac..4fcd612 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h +++ b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h @@ -17,7 +17,7 @@ public: virtual QString getName() {return sName;} virtual void setType(int n) {nType = n;} virtual int getType() {return nType;} - virtual void addConnect(const QString&,int nType); //与目标建立连接 + virtual void addConnect(const QString&,int nType,bool bCover = false); //与目标建立连接 virtual void addConnect(DiagramEditorBriefConnect); //直接添加连接 virtual void removeConnect(const QString&); virtual void removeConnect(DiagramEditorBriefConnect); diff --git a/diagramCavas/include/diagramEditor/diagramEditorBaySettingDlg.h b/diagramCavas/include/diagramEditor/diagramEditorBaySettingDlg.h new file mode 100644 index 0000000..8020ef2 --- /dev/null +++ b/diagramCavas/include/diagramEditor/diagramEditorBaySettingDlg.h @@ -0,0 +1,40 @@ +#ifndef DIAGRAMEDITORBAYSETTINGDLG_H +#define DIAGRAMEDITORBAYSETTINGDLG_H + +#include +#include "global.h" + +QT_BEGIN_NAMESPACE +namespace Ui { class diagramEditorBaySettingDlg; } +QT_END_NAMESPACE + +class DiagramEditorWizard; +class DiagramEditorBayBlock; + +class DiagramEditorBaySettingDlg : public QDialog +{ + Q_OBJECT +public: + DiagramEditorBaySettingDlg(QWidget *parent = nullptr); + ~DiagramEditorBaySettingDlg(); + + void initial(); + void showDlg(int nLevel); + void showDlg(int nLevel,DiagramEditorBayBlock*); + void setParent(DiagramEditorWizard* p) {_pWizard = p;} + void addNewBay(); +public slots: + void onAddClicked(); + void onDeleteClicked(); + void onOkClicked(); + void onCancelClicked(); + void onConnectLevelChanged(const QString&); //连接层级改变信号 +private: + Ui::diagramEditorBaySettingDlg *ui; + DiagramEditorWizard* _pWizard; + int _curModel; //0新增,1修改 + DiagramEditorBayBlock* _curOperateBlock; //当前修改对象 + int _curLevel; //当前层级 +}; + +#endif diff --git a/diagramCavas/include/diagramEditor/diagramEditorWizard.h b/diagramCavas/include/diagramEditor/diagramEditorWizard.h index 2ba76d2..05d7337 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorWizard.h +++ b/diagramCavas/include/diagramEditor/diagramEditorWizard.h @@ -11,6 +11,8 @@ QT_END_NAMESPACE class WizardBayContentDlg; class DiagramEditorBaseBlock; class DiagramEditorStructContainer; +class QListWidgetItem; +class DiagramEditorBaySettingDlg; class DiagramEditorWizard : public QDialog { @@ -20,7 +22,7 @@ public: ~DiagramEditorWizard(); signals: void wizardFinish(DiagramEditorWizardInfo); -protected: +public slots: void onOkClicked(); void onCancelClicked(); void onLastClicked(); @@ -29,20 +31,33 @@ protected: void onAddBusClicked(); //添加母线 void onAddBayClicked(); //添加间隔 void onAddTransClicked(); //添加变压器 + void onAddBayFinished(DiagramEditorWizardBayInfo); //添加间隔完毕 void onDelegateFinishEdit(const QModelIndex &index, const QString &value); //代理edit完成事件 void onBusDeleteClicked(); void onBusIndexRbtnClicked(const QPoint &pos); //bus列表右键菜单 + + void onBayListSelected(QListWidgetItem* pItem); //baylist选择事件 +public: + QMap getMapBusInfo() {return _mapBus;} + QMap> getCointainerStruct(){return _mapSturctContainer;} + QList getTargetLevelBlocks(int nLevel,int nType); //返回指定层数的对应block,type:1母线,2间隔 + DiagramEditorStructContainer* getContainerByBlock(int nLevel,int nType,QString sName); //根据block名称返回container + DiagramEditorBaseBlock* getBlockByName(int nLevel,int nType,QString sName); //根据名称返回block + bool removeBlockByName(int nLevel,int nType,const QString& sName); //依据名称删除block + WizardBayContentDlg* getContentDlg() {return _bayContentDlg;} + DiagramEditorBaySettingDlg* getBaySettingDlg() {return _baySettingDlg;} private: void initial(); void reOrderBus(); //重置bus次序 - - void generateBayPage(); //根据bus设置生成bay页 + void generateBayStruct(); //根据bus设置生成bay结构 + void showSelectedBayPage(int); //显示选中的bay页面 template void reindexQMap(QMap &map); //重新排序函数 private: Ui::diagramEditorWizard *ui; BiDirectionalMap _divideType; //划分段数名对照 WizardBayContentDlg* _bayContentDlg; + DiagramEditorBaySettingDlg* _baySettingDlg; QMap _mapBus; //母线信息 QMap> _mapSturctContainer; //划分后的区块 diff --git a/diagramCavas/include/diagramEditor/wizardBayContentDlg.h b/diagramCavas/include/diagramEditor/wizardBayContentDlg.h index 2659a0f..89fe6eb 100644 --- a/diagramCavas/include/diagramEditor/wizardBayContentDlg.h +++ b/diagramCavas/include/diagramEditor/wizardBayContentDlg.h @@ -5,6 +5,8 @@ #include #include "global.h" +class DiagramEditorWizard; + class WizardBayContentDlg: public QTableWidget { Q_OBJECT @@ -15,8 +17,15 @@ public: void initial(); void addBay(DiagramEditorWizardBayInfo); void clearData(); + void flushData(int nLevel); //使用选中层级数据刷新界面 + void setParent(DiagramEditorWizard* p) {_pWizard = p;} +public slots: + void onDeleteClicked(); + void onModifyClicked(); + void onIndexRbtnClicked(const QPoint &pos); //索引列表右键菜单 private: - int _curPageIndex; + int _curLevel; + DiagramEditorWizard* _pWizard; }; #endif diff --git a/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp b/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp index da79038..c9d353f 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp @@ -11,10 +11,13 @@ DiagramEditorBaseBlock::~DiagramEditorBaseBlock() } -void DiagramEditorBaseBlock::addConnect(const QString& str,int n) +void DiagramEditorBaseBlock::addConnect(const QString& str,int n,bool bCover) { - if(str == sName) - return; + if(!bCover){ + if(str == sName) + return; + } + for(auto& con:lstCon){ if(con.con1.sName == str || con.con2.sName == str){ //已存在不插入 return; diff --git a/diagramCavas/source/diagramEditor/diagramEditorBaySettingDlg.cpp b/diagramCavas/source/diagramEditor/diagramEditorBaySettingDlg.cpp new file mode 100644 index 0000000..bf207bb --- /dev/null +++ b/diagramCavas/source/diagramEditor/diagramEditorBaySettingDlg.cpp @@ -0,0 +1,174 @@ +#include +#include "diagramEditor/diagramEditorBaySettingDlg.h" +#include "diagramEditor/diagramEditorWizard.h" +#include "diagramEditor/diagramEditorBaseBlock.h" +#include "ui_diagramEditorBaySettingDlg.h" +#include "diagramEditor/diagramEditorStructContainer.h" +#include "diagramEditor/wizardBayContentDlg.h" + +DiagramEditorBaySettingDlg::DiagramEditorBaySettingDlg(QWidget *parent) + : QDialog(parent) + , ui(new Ui::diagramEditorBaySettingDlg) + ,_curOperateBlock(nullptr) +{ + ui->setupUi(this); + this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); + initial(); +} + +DiagramEditorBaySettingDlg::~DiagramEditorBaySettingDlg() +{ + delete ui; +} + +void DiagramEditorBaySettingDlg::showDlg(int nLevel) +{ + _curModel = 0; + show(); + addNewBay(); + if(_pWizard){ + auto mapBus = _pWizard->getMapBusInfo(); + double d = mapBus.value(nLevel).dVoltage; + ui->le_name->setText(QString::number(d)+"kV"); + ui->cb_level->setCurrentIndex(nLevel); + } + _curLevel = nLevel; +} + +void DiagramEditorBaySettingDlg::showDlg(int nLevel,DiagramEditorBayBlock* p) +{ + _curModel = 1; + if(_curOperateBlock == nullptr) + _curOperateBlock = p; + show(); + addNewBay(); + if(_pWizard){ + ui->le_name->setText(p->getName()); + ui->cb_level->setCurrentIndex(nLevel); + if(p){ + auto lstCon = p->getConnect(); + QStringList lst; + for(auto& con:lstCon){ + QString sOppo = con.getOppositeName(p->getName()); + lst.append(sOppo); + } + ui->listWidget->addItems(lst); + } + } + _curLevel = nLevel; +} + +void DiagramEditorBaySettingDlg::addNewBay() +{ + ui->cb_type->setCurrentIndex(0); + ui->cb_level->clear(); + ui->cb_target->clear(); + ui->listWidget->clear(); + if(_pWizard){ + auto mapAllCon = _pWizard->getCointainerStruct(); + for(auto iter = mapAllCon.begin();iter != mapAllCon.end();++iter){ + ui->cb_level->addItem("第"+QString::number(iter.key()+1)+"层",iter.key()); + } + } +} + +void DiagramEditorBaySettingDlg::initial() +{ + _curModel = 0; + _curLevel = 0; + connect(ui->btn_add,&QPushButton::clicked,this,&DiagramEditorBaySettingDlg::onAddClicked); + connect(ui->btn_delete,&QPushButton::clicked,this,&DiagramEditorBaySettingDlg::onDeleteClicked); + connect(ui->btn_ok,&QPushButton::clicked,this,&DiagramEditorBaySettingDlg::onOkClicked); + connect(ui->btn_cancel,&QPushButton::clicked,this,&DiagramEditorBaySettingDlg::onCancelClicked); + connect(ui->cb_level,&QComboBox::currentTextChanged,this,&DiagramEditorBaySettingDlg::onConnectLevelChanged); +} + +void DiagramEditorBaySettingDlg::onAddClicked() +{ + //auto pItem = ui->listWidget->currentItem(); + QString str = ui->cb_target->currentText(); + auto lst = ui->listWidget->findItems(str,Qt::MatchExactly); + if(lst.size() == 0){ //为空才添加 + ui->listWidget->addItem(str); + } +} + +void DiagramEditorBaySettingDlg::onDeleteClicked() +{ + int n = ui->listWidget->currentRow(); + if(n){ + auto pItem = ui->listWidget->takeItem(n); + delete pItem; + } +} + +void DiagramEditorBaySettingDlg::onOkClicked() +{ + QString sName = ui->le_name->text(); + BayType nType = BayType(ui->cb_type->currentIndex()); + if(_curModel == 0){ + if(_pWizard){ + auto map = _pWizard->getMapBusInfo(); + for(auto iter = map.begin();iter != map.end();++iter){ + auto lstBlock = _pWizard->getTargetLevelBlocks(iter.key(),2); + for(auto bay:lstBlock) + { + if(bay->getName() == sName){ //判断间隔存在 + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"间隔名已存在")); + return; + } + } + } + + QStringList lst; + for(int i = 0;i < ui->listWidget->count();++i){ + lst.append(ui->listWidget->item(i)->text()); + } + + DiagramEditorWizardBayInfo info; + info.sName = sName; + info.nType = nType; + info.lstBindObj = lst; + + _pWizard->onAddBayFinished(info); + } + } + else if(_curModel == 1){ + if(_curOperateBlock){ + _curOperateBlock->setName(sName); + _curOperateBlock->setBayType(nType); + _curOperateBlock->clearConnect(); + + for(int i = 0;i < ui->listWidget->count();++i){ + _curOperateBlock->addConnect(ui->listWidget->item(i)->text(),1,true); + } + + auto pContent = _pWizard->getContentDlg(); + pContent->flushData(_curLevel); + _curOperateBlock = nullptr; + } + } + hide(); +} + +void DiagramEditorBaySettingDlg::onCancelClicked() +{ + hide(); + if(_curOperateBlock) + _curOperateBlock = nullptr; +} + +void DiagramEditorBaySettingDlg::onConnectLevelChanged(const QString& str) +{ + if(_pWizard){ + int n = ui->cb_level->findText(str); + if(n != -1){ + ui->cb_target->clear(); + int nIndex = ui->cb_level->itemData(n).toInt(); + auto lstBlock = _pWizard->getTargetLevelBlocks(nIndex,1); + for(auto& block:lstBlock){ + ui->cb_target->addItem(block->getName()); + } + } + } +} diff --git a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp index d632057..695939e 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp @@ -6,10 +6,12 @@ #include "diagramEditor/wizardBayContentDlg.h" #include "diagramEditor/diagramEditorBaseBlock.h" #include "diagramEditor/diagramEditorStructContainer.h" +#include "diagramEditor/diagramEditorBaySettingDlg.h" DiagramEditorWizard::DiagramEditorWizard(QWidget *parent) : QDialog(parent) , ui(new Ui::diagramEditorWizard) + ,_baySettingDlg(nullptr) { ui->setupUi(this); _busPageChanged = false; @@ -25,6 +27,7 @@ DiagramEditorWizard::~DiagramEditorWizard() void DiagramEditorWizard::initial() { _bayContentDlg = new WizardBayContentDlg(this); + _bayContentDlg->setParent(this); ui->stackedWidget->addWidget(_bayContentDlg); ui->tabWidget->tabBar()->setEnabled(false); connect(ui->btn_ok,&QPushButton::clicked,this,&DiagramEditorWizard::onOkClicked); @@ -50,6 +53,8 @@ void DiagramEditorWizard::initial() connect(delegate,&WizardBusTableDelegate::editingFinished,this,&DiagramEditorWizard::onDelegateFinishEdit); connect(ui->tableWidget_bus, &QTableWidget::customContextMenuRequested, this, &DiagramEditorWizard::onBusIndexRbtnClicked); + connect(ui->listWidget_bay,&QListWidget::itemClicked,this,&DiagramEditorWizard::onBayListSelected); + _divideType.insert(1,"A段"); _divideType.insert(2,"B段"); _divideType.insert(3,"C段"); @@ -72,10 +77,13 @@ void DiagramEditorWizard::reOrderBus() } } -void DiagramEditorWizard::generateBayPage() +void DiagramEditorWizard::generateBayStruct() { for(auto iter = _mapBus.begin();iter != _mapBus.end();++iter) { + if(!iter->bChanged) //只生成修改过的程序 + continue; + iter->bChanged = false; QListWidgetItem* item = new QListWidgetItem("第"+QString::number(iter->nIndex+1)+"层"); item->setData(Qt::UserRole,iter->nIndex); ui->listWidget_bay->addItem(item); @@ -185,6 +193,11 @@ void DiagramEditorWizard::generateBayPage() } } +void DiagramEditorWizard::showSelectedBayPage(int nIdx) +{ + +} + template void DiagramEditorWizard::reindexQMap(QMap &map) { if (map.isEmpty()) return; @@ -237,7 +250,17 @@ void DiagramEditorWizard::onNextClicked() ui->stackedWidget_last->setCurrentIndex(1); ui->stackedWidget_next->setCurrentIndex(0); - + generateBayStruct(); + if(ui->listWidget_bay->count()){ + QListWidgetItem* targetItem = ui->listWidget_bay->item(0); + // 确保项有效 + if (targetItem) { + // 手动发射itemClicked信号 + emit ui->listWidget_bay->itemClicked(targetItem); + // 如果需要同时选中该项 + ui->listWidget_bay->setCurrentItem(targetItem); + } + } } else if(ui->tabWidget->currentIndex() == 1){ ui->tabWidget->setCurrentIndex(2); @@ -274,12 +297,17 @@ void DiagramEditorWizard::onAddBusClicked() DiagramEditorWizardBusInfo info; info.nIndex = row; + info.bChanged = true; _mapBus.insert(row,info); } void DiagramEditorWizard::onAddBayClicked() { - + if(_baySettingDlg == nullptr){ + _baySettingDlg = new DiagramEditorBaySettingDlg(this); + _baySettingDlg->setParent(this); + } + _baySettingDlg->showDlg(ui->listWidget_bay->currentItem()->data(Qt::UserRole).toInt()); } void DiagramEditorWizard::onAddTransClicked() @@ -287,6 +315,28 @@ void DiagramEditorWizard::onAddTransClicked() } +void DiagramEditorWizard::onAddBayFinished(DiagramEditorWizardBayInfo info) +{ + int curIndex = ui->listWidget_bay->currentItem()->data(Qt::UserRole).toInt(); //当前层级 + + if(!info.lstBindObj.isEmpty()){ + auto pContainer = getContainerByBlock(curIndex,1,info.lstBindObj.first()); + + DiagramEditorBayBlock* pBlock = new DiagramEditorBayBlock(this); + pBlock->setName(info.sName); + pBlock->setType(2); + pBlock->setBayType(info.nType); + + for(auto& sName:info.lstBindObj){ + pBlock->addConnect(sName,1); + } + + pContainer->insertBlock(3,pBlock); + + _bayContentDlg->flushData(curIndex); + } +} + void DiagramEditorWizard::onDelegateFinishEdit(const QModelIndex &index, const QString &value) { int row = index.row(); @@ -385,3 +435,77 @@ void DiagramEditorWizard::onBusIndexRbtnClicked(const QPoint &pos) // 在点击位置显示菜单 menu.exec(ui->tableWidget_bus->mapToGlobal(pos)); } + +void DiagramEditorWizard::onBayListSelected(QListWidgetItem* pItem) +{ + int nIndex = pItem->data(Qt::UserRole).toInt(); + ui->label_level->setText("第"+QString::number(nIndex+1)+"层"); + _bayContentDlg->flushData(nIndex); +} + +QList DiagramEditorWizard::getTargetLevelBlocks(int nLevel,int nType) +{ + QList lstBlock; + for(auto iter = _mapSturctContainer.begin();iter != _mapSturctContainer.end();++iter){ + if(iter.key() == nLevel){ + for(auto& container:iter.value()) + { + auto mapBlock = container->getBlockMap(); + for(auto& lst:mapBlock) + { + for(auto& block:lst) + { + if(block->getType() == nType){ //返回对应type + lstBlock.append(block); + } + } + } + } + } + } + return lstBlock; +} + +DiagramEditorStructContainer* DiagramEditorWizard::getContainerByBlock(int nLevel,int nType,QString sName) +{ + DiagramEditorStructContainer* pContainer = nullptr; + auto lstBlock = getTargetLevelBlocks(nLevel,nType); + for(auto& block:lstBlock){ + if(block->getName() == sName){ + pContainer = block->getCurContainer(); + break; + } + } + return pContainer; +} + +DiagramEditorBaseBlock* DiagramEditorWizard::getBlockByName(int nLevel,int nType,QString sName) +{ + DiagramEditorBaseBlock* pBlock = nullptr; + auto lstBlock = getTargetLevelBlocks(nLevel,nType); + for(auto& block:lstBlock){ + if(block->getName() == sName){ + return block; + } + } + return pBlock; +} + +bool DiagramEditorWizard::removeBlockByName(int nLevel,int nType,const QString& sName) +{ + DiagramEditorStructContainer* pCon = getContainerByBlock(nLevel,nType,sName); + if(pCon){ + auto& mapBlock = pCon->getBlockMap(); + for(auto& lst:mapBlock){ + + for(int i = 0;i< lst.size();++i){ + if(lst[i]->getName() == sName){ + delete lst[i]; + lst.removeAt(i); + return true; + } + } + } + } + return false; +} diff --git a/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp b/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp index 42f5c05..662ff79 100644 --- a/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp +++ b/diagramCavas/source/diagramEditor/wizardBayContentDlg.cpp @@ -1,8 +1,14 @@ -#include "diagramEditor/wizardBayContentDlg.h" #include +#include +#include "diagramEditor/wizardBayContentDlg.h" +#include "diagramEditor/diagramEditorWizard.h" +#include "diagramEditor/diagramEditorBaseBlock.h" +#include "diagramEditor/diagramEditorStructContainer.h" +#include "diagramEditor/diagramEditorBaySettingDlg.h" WizardBayContentDlg::WizardBayContentDlg(QWidget *parent) : QTableWidget(parent) + ,_pWizard(nullptr) { initial(); } @@ -13,7 +19,7 @@ WizardBayContentDlg::~WizardBayContentDlg() void WizardBayContentDlg::initial() { - _curPageIndex = 0; + _curLevel = 0; QStringList headerText; headerText<<"间隔名称"<<"间隔类型"<<"连接对象"; setContextMenuPolicy(Qt::CustomContextMenu); @@ -22,6 +28,8 @@ void WizardBayContentDlg::initial() setColumnCount(headerText.count()); setHorizontalHeaderLabels(headerText); horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + verticalHeader()->setVisible(false); + connect(this, &QTableWidget::customContextMenuRequested, this, &WizardBayContentDlg::onIndexRbtnClicked); } void WizardBayContentDlg::addBay(DiagramEditorWizardBayInfo obj) @@ -70,5 +78,113 @@ void WizardBayContentDlg::addBay(DiagramEditorWizardBayInfo obj) void WizardBayContentDlg::clearData() { - clear(); + clearContents(); + setRowCount(0); +} + +void WizardBayContentDlg::flushData(int nLevel) +{ + clearData(); + if(_pWizard){ + QList lst = _pWizard->getTargetLevelBlocks(nLevel,2); + for(auto& block:lst){ + auto pItem = dynamic_cast(block); + if(pItem){ + DiagramEditorWizardBayInfo info; + info.sName = pItem->getName(); + info.nType = pItem->getBayType(); + auto lstCon = pItem->getConnect(); //获取间隔所连对象的名称 + for(auto& con:lstCon){ + QString sOpposite = con.getOppositeName(pItem->getName()); + info.lstBindObj.append(sOpposite); + } + + addBay(info); + } + } + } + _curLevel = nLevel; +} + +void WizardBayContentDlg::onDeleteClicked() +{ + // 获取当前选中的索引 + QModelIndexList selectedIndexes = this->selectionModel()->selectedRows(); + if (selectedIndexes.isEmpty()) { + return; // 没有选中任何行 + } + + // 获取当前选中的第一项索引 + QModelIndex index = selectedIndexes.first(); + if (!index.isValid()) { + return; + } + + QModelIndex indexName = index.sibling(index.row(),0); + QString sName = indexName.data().toString(); + if(_pWizard){ + bool res = _pWizard->removeBlockByName(_curLevel,2,sName); + if(res){ + flushData(_curLevel); + } + else{ + return; + } + } + + int currentRow = this->currentRow(); + if (currentRow == -1) { + return; // 没有选中行 + } + + this->removeRow(currentRow); +} + +void WizardBayContentDlg::onModifyClicked() +{ + // 获取当前选中的索引 + QModelIndexList selectedIndexes = this->selectionModel()->selectedRows(); + if (selectedIndexes.isEmpty()) { + return; // 没有选中任何行 + } + + // 获取当前选中的第一项索引 + QModelIndex index = selectedIndexes.first(); + if (!index.isValid()) { + return; + } + + QModelIndex indexName = index.sibling(index.row(),0); + QString sName = indexName.data().toString(); + + if(_pWizard){ + DiagramEditorBaseBlock* pBlock = _pWizard->getBlockByName(_curLevel,2,sName); + if(pBlock){ + auto pBay = dynamic_cast(pBlock); + if(pBay) + _pWizard->getBaySettingDlg()->showDlg(_curLevel,pBay); + } + } +} + +void WizardBayContentDlg::onIndexRbtnClicked(const QPoint &pos) +{ + // 获取当前点击的位置对应的索引 + QModelIndex index = this->indexAt(pos); + if (!index.isValid()) { + return; // 如果点击的是空白区域,直接返回 + } + + QMenu menu; + QAction *deleteAction = new QAction("移除间隔", this); + QAction *modifyAction = new QAction("修改间隔", this); + menu.addAction(deleteAction); + menu.addAction(modifyAction); + + // 连接删除菜单项的触发信号与槽函数 + connect(deleteAction, &QAction::triggered, this, &WizardBayContentDlg::onDeleteClicked); + connect(modifyAction, &QAction::triggered, this, &WizardBayContentDlg::onModifyClicked); + + // 在点击位置显示菜单 + menu.exec(this->mapToGlobal(pos)); } diff --git a/diagramCavas/ui/diagramEditorBaySettingDlg.ui b/diagramCavas/ui/diagramEditorBaySettingDlg.ui new file mode 100644 index 0000000..556f717 --- /dev/null +++ b/diagramCavas/ui/diagramEditorBaySettingDlg.ui @@ -0,0 +1,293 @@ + + + diagramEditorBaySettingDlg + + + + 0 + 0 + 521 + 425 + + + + + 12 + + + + Dialog + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 16777215 + 25 + + + + background-color: rgb(196, 196, 196); + + + + 0 + + + 0 + + + 0 + + + + + + 12 + + + + color: rgb(0, 0, 0); + + + 设置间隔 + + + + + + + Qt::Orientation::Horizontal + + + + 460 + 20 + + + + + + + + + + + + + + 基本信息 + + + + 6 + + + + + 间隔名称 + + + + + + + + + + 间隔类型 + + + + + + + + 分段间隔 + + + + + 母联间隔 + + + + + PT间隔 + + + + + 进线间隔 + + + + + 出线间隔 + + + + + 无功补偿间隔 + + + + + 旁路间隔 + + + + + 主变间隔 + + + + + + + + + + + 连接信息 + + + + 20 + + + + + 0 + + + 15 + + + + + 连接位置 + + + + + + + + + + 连接对象 + + + + + + + + + + 20 + + + + + 添加 + + + + + + + 删除 + + + + + + + + + + + + + 连接列表 + + + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 155 + + + + + + + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + 确定 + + + + + + + 取消 + + + + + + + + + +