diff --git a/diagramCavas/CMakeLists.txt b/diagramCavas/CMakeLists.txt index 3dd6fd9..999d545 100644 --- a/diagramCavas/CMakeLists.txt +++ b/diagramCavas/CMakeLists.txt @@ -15,6 +15,7 @@ set(DIAGRAMCAVAS_HEADER_FILES include/monitorAttributeDlg.h include/monitorAttributeGroupDlg.h include/monitorConfigDlg.h + include/monitorDetailAttributeDlg.h include/itemPropertyDlg.h include/propertyContentDlg.h include/serializable.h @@ -131,6 +132,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES source/monitorAttributeDlg.cpp source/monitorAttributeGroupDlg.cpp source/monitorConfigDlg.cpp + source/monitorDetailAttributeDlg.cpp source/itemPropertyDlg.cpp source/propertyContentDlg.cpp source/statusBar.cpp @@ -250,6 +252,7 @@ set(UI_FILES ui/confirmEditorDlg.ui ui/projectIconSetting.ui ui/monitorConfigDlg.ui + ui/monitorDetailAttributeDlg.ui ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index 9b991f6..ad1da09 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -102,6 +102,9 @@ public: void generateMonitor(QString,QList); //生成监控 (监控名,选中的设备列表) void generateMonitorConfig(MonitorPanel*); //生成监控配置参数结构 QMap>& getMonitorPara() {return m_monitorPara;} + + void monitorItemSelected(QUuid); //运行时item选中事件 + void monitorItemDetailAttr(QUuid); //显示属性详情 Q_SIGNALS: void activatePage(const QString&); //激活当前model所在page void updateCurrentItems(QList,bool); //更新当前组态元件列表 <名称,uid> diff --git a/diagramCavas/include/monitorAttributeDlg.h b/diagramCavas/include/monitorAttributeDlg.h index 6f71c8c..0e68edf 100644 --- a/diagramCavas/include/monitorAttributeDlg.h +++ b/diagramCavas/include/monitorAttributeDlg.h @@ -3,8 +3,12 @@ #include #include +#include class MonitorToolBox; +class MonitorAttributeGroupDlg; +class MonitorSideBarDlg; +struct monitorItemAttributeInfo; class MonitorAttributeDlg : public QDialog { @@ -14,10 +18,15 @@ public: ~MonitorAttributeDlg(); void initial(); - void setCurAttribute(MonitorToolBox*); //设置当前显示的属性对象 - void clearCurAttribute(); //清空属性对象 + void generateAttributeGroups(QUuid); + MonitorSideBarDlg* getParent(){return _pParent;} + QUuid getCurId() {return _curId;} + void clearAllGroup(); private: QVBoxLayout* _pLayout; + MonitorToolBox* _pBox; + QUuid _curId; + MonitorSideBarDlg* _pParent; }; #endif diff --git a/diagramCavas/include/monitorAttributeGroupDlg.h b/diagramCavas/include/monitorAttributeGroupDlg.h index fb83561..1d04edf 100644 --- a/diagramCavas/include/monitorAttributeGroupDlg.h +++ b/diagramCavas/include/monitorAttributeGroupDlg.h @@ -5,6 +5,13 @@ #include #include +class MonitorAttributeDlg; +struct monitorItemAttributeInfo; +class QChartView; +class QLabel; +class FixedPortsModel; +class MonitorDetailAttributeDlg; + class MonitorAttributeGroupDlg : public QScrollArea { Q_OBJECT @@ -13,9 +20,22 @@ public: ~MonitorAttributeGroupDlg(); void initial(); - void createGroupView(); + void createGroupView(QList); + void setParent(MonitorAttributeDlg* p) {_pParent = p;} + void setDetailParent(MonitorDetailAttributeDlg* p){_pDetailParent = p;} + void setCurMode(int n) {_curMode = n;} +private: + QWidget* createEditor(monitorItemAttributeInfo); + void updateLineChartData(QChartView* chartView, const QVector& data); + void updateData(); //使用数据更新当前界面 + FixedPortsModel* getModelController(); + QUuid getCurUid(); private: QVBoxLayout* _layout; + MonitorAttributeDlg* _pParent; + MonitorDetailAttributeDlg* _pDetailParent; + QMap _curWidget; //当前控件 + int _curMode; //0简略模式 1详细模式 }; #endif diff --git a/diagramCavas/include/monitorDetailAttributeDlg.h b/diagramCavas/include/monitorDetailAttributeDlg.h new file mode 100644 index 0000000..b0afb08 --- /dev/null +++ b/diagramCavas/include/monitorDetailAttributeDlg.h @@ -0,0 +1,42 @@ +#ifndef MONITORDETAILATTRIBUTEDLG_H +#define MONITORDETAILATTRIBUTEDLG_H + +/******************监控属性详情页*********************/ + +#include +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class monitorDetailAttributeDlg; } +QT_END_NAMESPACE + +class QGridLayout; +class MonitorAttributeGroupDlg; +class MonitorPanel; + +class MonitorDetailAttributeDlg : public QDialog +{ + Q_OBJECT +public: + MonitorDetailAttributeDlg(QWidget *parent = nullptr); + ~MonitorDetailAttributeDlg(); + + void initial(); + void generateAttributeGroups(QUuid uid); + void updateLayout(int columns); + MonitorPanel* getParent() {return _pParent;} + QUuid getCurId() {return _curId;} + void clearAllGroup(); +public slots: + void onCloseClicked(); + void onColChanged(const QString&); +private: + Ui::monitorDetailAttributeDlg *ui; + int _curColNum; //当前每行的列数 + QGridLayout* m_gridLayout; + QMap _curGroups; + MonitorPanel* _pParent; + QUuid _curId; +}; + +#endif diff --git a/diagramCavas/include/monitorPanel.h b/diagramCavas/include/monitorPanel.h index d6def77..1b54302 100644 --- a/diagramCavas/include/monitorPanel.h +++ b/diagramCavas/include/monitorPanel.h @@ -8,6 +8,7 @@ class PowerEntity; class MonitorSideBarDlg; class MonitorConfigDlg; +class MonitorDetailAttributeDlg; class MonitorPanel : public BaseDrawingPanel { @@ -28,6 +29,8 @@ public: QStandardItemModel* getLstModel() {return _itemListmodel;} void initMonitorConfig(); //初始化参数设置(每个运行时可能不同) + void itemSelected(QUuid); //item选中事件 + void detailItemSelected(QUuid); //显示详细属性页 public slots: void onRunClicked(); void onStopClicked(); @@ -43,6 +46,8 @@ private: MonitorSideBarDlg* _sideBar; MonitorConfigDlg* _pConfigDlg; QStandardItemModel* _itemListmodel; + MonitorDetailAttributeDlg* _detailAttributeDlg; + QMenu* _menuSetting; }; #endif diff --git a/diagramCavas/include/monitorSelectedItemsDlg.h b/diagramCavas/include/monitorSelectedItemsDlg.h index 34a7ebd..b03109d 100644 --- a/diagramCavas/include/monitorSelectedItemsDlg.h +++ b/diagramCavas/include/monitorSelectedItemsDlg.h @@ -7,6 +7,7 @@ struct monitorRelationItem; class MonitorSideBarDlg; +class QVBoxLayout; class MonitorSelectedItemsDlg : public QDialog { @@ -17,9 +18,12 @@ public: void initial(); void updateItems(); +public slots: + void onSelectionChanged(const QModelIndex ¤t, const QModelIndex &previous); //属性选中事件 private: QTreeView* _treeView; MonitorSideBarDlg* _parent; + QVBoxLayout* _pLayout; }; #endif diff --git a/diagramCavas/include/monitorSideBarDlg.h b/diagramCavas/include/monitorSideBarDlg.h index 17a8305..62c6591 100644 --- a/diagramCavas/include/monitorSideBarDlg.h +++ b/diagramCavas/include/monitorSideBarDlg.h @@ -17,6 +17,7 @@ public: void initial(); MonitorPanel* getParent() {return _parent;} MonitorSelectedItemsDlg* getItemsDlg() {return _itemsDlg;} + MonitorAttributeDlg* getAttributeDlg() {return _attributeDlg;} private: MonitorSelectedItemsDlg* _itemsDlg; MonitorAttributeDlg* _attributeDlg; diff --git a/diagramCavas/include/monitorToolBox.h b/diagramCavas/include/monitorToolBox.h index 7cd58a0..53eb51f 100644 --- a/diagramCavas/include/monitorToolBox.h +++ b/diagramCavas/include/monitorToolBox.h @@ -13,6 +13,7 @@ public: ~MonitorToolBox(); void addWidget(const QString &title, QWidget *widget); void removeWidget(const QString &title); + void removeAllWidget(); private: QWidget* _container; QVBoxLayout *m_pContentVBoxLayout; diff --git a/diagramCavas/source/baseDrawingPanel.cpp b/diagramCavas/source/baseDrawingPanel.cpp index df58740..3276f1f 100644 --- a/diagramCavas/source/baseDrawingPanel.cpp +++ b/diagramCavas/source/baseDrawingPanel.cpp @@ -34,6 +34,7 @@ BaseDrawingPanel::BaseDrawingPanel(PowerEntity* pEntity,QWidget *parent,DiagramM _pModel->setScene(m_pGraphicsScene); m_pStatusBar = new StatusBar(this); + m_pStatusBar->setMaximumHeight(25); connect(m_pGraphicsView,&DesignerView::onScaleChanged,m_pStatusBar,&StatusBar::onScaleLevelChanged); _horizontalLayout = new QHBoxLayout(); diff --git a/diagramCavas/source/designerScene.cpp b/diagramCavas/source/designerScene.cpp index af70dcd..a953fa4 100644 --- a/diagramCavas/source/designerScene.cpp +++ b/diagramCavas/source/designerScene.cpp @@ -130,8 +130,6 @@ void DesignerScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) if(m_pDrawingPanel) { DiagramMode mode = m_pDrawingPanel->getMode(); - if(mode == DM_run) - return; m_pDrawingPanel->selectorManager()->getWorkingSelector()->contextMenuEvent(event, this,mode); update(); } diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index f522e3b..fe74f1b 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -2710,8 +2710,8 @@ void FixedPortsModel::generateMonitorConfig(MonitorPanel* pPanel) for(auto it = mapMeasure.begin(); it != mapMeasure.end();++it){ monitorItemAttributeInfo info; info.sGroup = iter.key(); - info.sTag = it->tag; - info.sName = it->name; + info.sTag = it->name; + info.sName = it->tag; info.nConnectType = 1; lstInfo.append(info); } @@ -2726,3 +2726,19 @@ void FixedPortsModel::generateMonitorConfig(MonitorPanel* pPanel) } } } + +void FixedPortsModel::monitorItemSelected(QUuid uid) +{ + auto pMonitor = dynamic_cast(_widget); + if(pMonitor){ + pMonitor->itemSelected(uid); + } +} + +void FixedPortsModel::monitorItemDetailAttr(QUuid uid) +{ + auto pMonitor = dynamic_cast(_widget); + if(pMonitor){ + pMonitor->detailItemSelected(uid); + } +} diff --git a/diagramCavas/source/monitorAttributeDlg.cpp b/diagramCavas/source/monitorAttributeDlg.cpp index 93602e0..646393a 100644 --- a/diagramCavas/source/monitorAttributeDlg.cpp +++ b/diagramCavas/source/monitorAttributeDlg.cpp @@ -1,11 +1,18 @@ #include "monitorAttributeDlg.h" +#include "monitorAttributeGroupDlg.h" +#include "monitorPanel.h" #include "monitorToolBox.h" +#include "monitorSideBarDlg.h" #include +#include "global.h" MonitorAttributeDlg::MonitorAttributeDlg(QWidget* parent) : QDialog(parent) ,_pLayout(nullptr) + ,_pBox(nullptr) + ,_pParent(nullptr) { + _pParent = dynamic_cast(parent); initial(); } @@ -17,26 +24,33 @@ MonitorAttributeDlg::~MonitorAttributeDlg() void MonitorAttributeDlg::initial() { _pLayout = new QVBoxLayout(this); + _pBox = new MonitorToolBox(this); + _pBox->setContentsMargins(0, 0, 0, 0); + _pLayout->addWidget(_pBox); } -void MonitorAttributeDlg::setCurAttribute(MonitorToolBox* pBox) +void MonitorAttributeDlg::generateAttributeGroups(QUuid uid) { - if(_pLayout->count() == 0){ //当前无对象,添加 - _pLayout->addWidget(pBox); - } - else{ - clearCurAttribute(); - _pLayout->addWidget(pBox); - } -} - -void MonitorAttributeDlg::clearCurAttribute() //移除当前属性 -{ - for (int i = 0; i < _pLayout->count(); ++i) { - QLayoutItem* item = _pLayout->itemAt(i); - auto pWidget = item->widget(); - if(pWidget){ - _pLayout->removeWidget(pWidget); + QMap> mapLst; + auto mapPara = getParent()->getParent()->getModelController()->getMonitorPara(); + if(mapPara.contains(uid)){ + auto lst = mapPara[uid]; + for(auto &info:lst){ + if(info.bSelected) + mapLst[info.sGroup].append(info); } + + for(auto iter = mapLst.begin(); iter != mapLst.end();++iter){ + MonitorAttributeGroupDlg* pDlg = new MonitorAttributeGroupDlg(); + pDlg->setParent(this); + pDlg->createGroupView(iter.value()); + _pBox->addWidget(iter.key(),pDlg); + } + _curId = uid; } } + +void MonitorAttributeDlg::clearAllGroup() +{ + _pBox->removeAllWidget(); +} diff --git a/diagramCavas/source/monitorAttributeGroupDlg.cpp b/diagramCavas/source/monitorAttributeGroupDlg.cpp index ec3bd2e..52ef1f7 100644 --- a/diagramCavas/source/monitorAttributeGroupDlg.cpp +++ b/diagramCavas/source/monitorAttributeGroupDlg.cpp @@ -1,11 +1,25 @@ #include "monitorAttributeGroupDlg.h" +#include "monitorAttributeDlg.h" +#include "monitorSideBarDlg.h" +#include "monitorPanel.h" +#include "monitorDetailAttributeDlg.h" #include #include #include +#include +#include +#include +#include +#include +#include +#include "global.h" MonitorAttributeGroupDlg::MonitorAttributeGroupDlg(QWidget* parent) : QScrollArea(parent) ,_layout(nullptr) + ,_pParent(nullptr) + ,_pDetailParent(nullptr) + ,_curMode(0) { initial(); } @@ -20,23 +34,230 @@ void MonitorAttributeGroupDlg::initial() _layout = new QVBoxLayout(this); } -void MonitorAttributeGroupDlg::createGroupView() +void MonitorAttributeGroupDlg::createGroupView(QList lst) { QWidget* content = new QWidget(); - QFormLayout* layout = new QFormLayout(content); - layout->setHorizontalSpacing(20); // 标签与控件间距 - layout->setVerticalSpacing(12); // 行间距 - layout->setLabelAlignment(Qt::AlignRight); // 标签右对齐 - layout->setContentsMargins(12, 12, 12, 12); // 内边距 + QGridLayout* gridLayout = new QGridLayout(content); + gridLayout->setHorizontalSpacing(20); + gridLayout->setVerticalSpacing(12); + //gridLayout->setContentsMargins(12, 12, 12, 12); + + // 设置列的最小宽度和拉伸比例 + gridLayout->setColumnMinimumWidth(0, 30); // 标签列最小宽度 + gridLayout->setColumnStretch(0, 1); // 标签列拉伸因子 + gridLayout->setColumnStretch(1, 5); // 控件列拉伸因子 + + int row = 0; + for(auto& info : lst) { + QLabel* label = new QLabel(info.sTag, this); + label->setAlignment(Qt::AlignRight | Qt::AlignVCenter); + label->setMaximumWidth(40); // 设置标签最大宽度 - // 动态生成字段 - /*for(auto& info:infos.info) { - QLabel* label = new QLabel(info.name,this); QWidget* editor = createEditor(info); - formLayout->addRow(label, editor); - }*/ + editor->setProperty("category", info.nShowType); + editor->setProperty("graphType", info.nGraphType); + editor->setProperty("connectPara", info.sConnectPara); + + // 添加到网格布局 + gridLayout->addWidget(label, row, 0, Qt::AlignRight | Qt::AlignVCenter); + gridLayout->addWidget(editor, row, 1); + + // 设置行的拉伸因子(可选) + gridLayout->setRowStretch(row, 0); // 不拉伸,保持内容高度 + + _curWidget.insert(info.sTag, editor); + row++; + } + + // 添加一个拉伸行,使内容在顶部对齐 + gridLayout->setRowStretch(row, 1); setWidget(content); setWidgetResizable(true); } +QWidget* MonitorAttributeGroupDlg::createEditor(monitorItemAttributeInfo info) +{ + QWidget* pWidget = nullptr; + if(info.nShowType == 0){ //正常显示 + QLabel *label = new QLabel(this); + pWidget = label; + } + else{ //图表 + QChartView* chartView = new QChartView(this); + chartView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + chartView->setRenderHint(QPainter::Antialiasing); + + QChart* chart = new QChart(); + chartView->setChart(chart); + + if (info.nGraphType == 0) { + // 创建折线序列 + QLineSeries* series = new QLineSeries(); + + // 创建图表 + chart->addSeries(series); + chart->setTitle(info.sName); + chart->setAnimationOptions(QChart::SeriesAnimations); + + // 设置线条样式 + QPen pen(Qt::blue); + pen.setWidth(3); + pen.setStyle(Qt::SolidLine); + series->setPen(pen); + + // 创建坐标轴 + QValueAxis* axisX = new QValueAxis(); + QValueAxis* axisY = new QValueAxis(); + + // 设置坐标轴标题 + axisX->setTitleText("时间"); + axisY->setTitleText("值"); + + // 添加坐标轴到图表 + chart->addAxis(axisX, Qt::AlignBottom); + chart->addAxis(axisY, Qt::AlignLeft); + + // 将序列关联到坐标轴 + series->attachAxis(axisX); + series->attachAxis(axisY); + + // 设置默认范围或等待数据更新 + axisX->setRange(0, 10); // 临时范围 + axisY->setRange(0, 100); + + chart->setTheme(QChart::ChartThemeLight); + chart->legend()->setVisible(true); + chart->legend()->setAlignment(Qt::AlignBottom); + } + else if (info.nGraphType == 1) { + QBarSeries* series = new QBarSeries(); + chart->addSeries(series); + chart->setTitle(info.sName); + chart->setAnimationOptions(QChart::SeriesAnimations); + + // 创建坐标轴 + QBarCategoryAxis* axisX = new QBarCategoryAxis(); + QValueAxis* axisY = new QValueAxis(); + + chart->addAxis(axisX, Qt::AlignBottom); + chart->addAxis(axisY, Qt::AlignLeft); + series->attachAxis(axisX); + series->attachAxis(axisY); + } + + pWidget = chartView; + } + return pWidget; +} + +void MonitorAttributeGroupDlg::updateLineChartData(QChartView* chartView, const QVector& data) +{ + if (!chartView || !chartView->chart()) return; + + QChart* chart = chartView->chart(); + if (chart->series().isEmpty()) return; + + QLineSeries* series = qobject_cast(chart->series().first()); + if (!series) return; + + // 清空旧数据,添加新数据 + series->clear(); + series->append(data); + + // 更新坐标轴范围 + if (!data.isEmpty()) { + QValueAxis* aX = nullptr; + QValueAxis* aY = nullptr; + + // 方法1:通过方向获取 + QList xAxes = chart->axes(Qt::Horizontal); + QList yAxes = chart->axes(Qt::Vertical); + + for (QAbstractAxis* axis : xAxes) { + if (qobject_cast(axis)) { + aX = static_cast(axis); + break; + } + } + + for (QAbstractAxis* axis : yAxes) { + if (qobject_cast(axis)) { + aY = static_cast(axis); + break; + } + } + + if (aX && aY) { + double minX = data.first().x(); + double maxX = data.last().x(); + double minY = std::numeric_limits::max(); + double maxY = std::numeric_limits::lowest(); + + for (const QPointF& point : data) { + minY = qMin(minY, point.y()); + maxY = qMax(maxY, point.y()); + } + + double margin = (maxY - minY) * 0.1; + aX->setRange(minX, maxX); + aY->setRange(minY - margin, maxY + margin); + } + } +} + +void MonitorAttributeGroupDlg::updateData() +{ + if(_pParent){ + auto pModel = getModelController(); + auto pMap = pModel->getMonitorPara(); + QUuid uid = getCurUid(); + + if(pMap.contains(uid)){ + auto info = pMap.value(uid); + + for(auto &widget:_curWidget){ + int nCate = widget->property("category").toInt(); + int nGraph = widget->property("graphType").toInt(); + QString sPara = widget->property("connectPara").toString(); + + for(auto& data:info){ + if(data.sConnectPara == sPara){ + if(nCate == 0){ + QLabel* pLabel = dynamic_cast(widget); + pLabel->setText(data.sValue); + } + else{ + if(nGraph == 0){ // + QChartView* pView = dynamic_cast(widget); + //updateLineChartData(pView,); + } + } + } + } + } + } + } +} + +FixedPortsModel* MonitorAttributeGroupDlg::getModelController() +{ + FixedPortsModel* pModel; + if(_curMode == 0){ + pModel = _pParent->getParent()->getParent()->getModelController(); + } + else{ + pModel = _pDetailParent->getParent()->getModelController(); + } + return pModel; +} + +QUuid MonitorAttributeGroupDlg::getCurUid() +{ + if(_curMode == 0){ + return _pParent->getCurId(); + } + else{ + return _pDetailParent->getCurId(); + } +} diff --git a/diagramCavas/source/monitorDetailAttributeDlg.cpp b/diagramCavas/source/monitorDetailAttributeDlg.cpp new file mode 100644 index 0000000..fbfe483 --- /dev/null +++ b/diagramCavas/source/monitorDetailAttributeDlg.cpp @@ -0,0 +1,86 @@ +#include "monitorDetailAttributeDlg.h" +#include "ui_monitorDetailAttributeDlg.h" +#include "monitorAttributeGroupDlg.h" +#include "monitorPanel.h" +#include "global.h" + +MonitorDetailAttributeDlg::MonitorDetailAttributeDlg(QWidget *parent) + : QDialog(parent) + , ui(new Ui::monitorDetailAttributeDlg) + ,_pParent(nullptr) + ,m_gridLayout(nullptr) +{ + _pParent = dynamic_cast(parent); + ui->setupUi(this); + this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); + initial(); +} + +MonitorDetailAttributeDlg::~MonitorDetailAttributeDlg() +{ + delete ui; +} + +void MonitorDetailAttributeDlg::initial() +{ + _curColNum = 2; + connect(ui->btn_exit,&QPushButton::clicked,this,&MonitorDetailAttributeDlg::onCloseClicked); + connect(ui->cb_colNum,&QComboBox::currentTextChanged,this,&MonitorDetailAttributeDlg::onColChanged); + m_gridLayout = new QGridLayout(ui->content); +} + +void MonitorDetailAttributeDlg::onCloseClicked() +{ + hide(); +} + +void MonitorDetailAttributeDlg::onColChanged(const QString& str) +{ + updateLayout(str.toInt()); +} + +void MonitorDetailAttributeDlg::generateAttributeGroups(QUuid uid) +{ + clearAllGroup(); + QMap> mapLst; + auto mapPara = _pParent->getModelController()->getMonitorPara(); + if(mapPara.contains(uid)){ + _curId = uid; + auto lst = mapPara[uid]; + for(auto &info:lst){ + if(info.bSelected) + mapLst[info.sGroup].append(info); + } + + for(auto iter = mapLst.begin(); iter != mapLst.end();++iter){ + MonitorAttributeGroupDlg* pDlg = new MonitorAttributeGroupDlg(); + pDlg->setDetailParent(this); + pDlg->setCurMode(1); + pDlg->createGroupView(iter.value()); + _curGroups.insert(iter.key(),pDlg); + } + } + + updateLayout(_curColNum); +} + +void MonitorDetailAttributeDlg::updateLayout(int columns) +{ + _curColNum = columns; + int i = 0; + for(auto& pDlg:_curGroups){ + int row = i / _curColNum; + int col = i % _curColNum; + m_gridLayout->addWidget(pDlg, row, col); + i++; + } +} + +void MonitorDetailAttributeDlg::clearAllGroup() +{ + for(auto& dlg:_curGroups){ + m_gridLayout->removeWidget(dlg); + delete dlg; + } + _curGroups.clear(); +} diff --git a/diagramCavas/source/monitorPanel.cpp b/diagramCavas/source/monitorPanel.cpp index f9e7729..b1ebf81 100644 --- a/diagramCavas/source/monitorPanel.cpp +++ b/diagramCavas/source/monitorPanel.cpp @@ -13,6 +13,8 @@ #include "monitorSideBarDlg.h" #include "monitorSelectedItemsDlg.h" #include "monitorConfigDlg.h" +#include "monitorAttributeDlg.h" +#include "monitorDetailAttributeDlg.h" MonitorPanel::MonitorPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode) : BaseDrawingPanel(pEntity,parent,mode) @@ -20,6 +22,8 @@ MonitorPanel::MonitorPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode ,_sideBar(nullptr) ,_pConfigDlg(nullptr) ,_itemListmodel(nullptr) + ,_menuSetting(nullptr) + ,_detailAttributeDlg(nullptr) { m_pStatusBar->setButtonVisible(false); initial(); @@ -39,6 +43,7 @@ void MonitorPanel::initial() _hSplitter->addWidget(_sideBar); _sideBar->show(); _pConfigDlg = new MonitorConfigDlg(this); + _detailAttributeDlg = new MonitorDetailAttributeDlg(this); } void MonitorPanel::closeEvent(QCloseEvent *closeEvent) @@ -67,6 +72,33 @@ void MonitorPanel::createToolBar() connect(connectAction, &QAction::triggered, this, &MonitorPanel::onConncecClicked); _toolBar->addAction(connectAction); + QAction *otherAction = new QAction("其他设置", this); + _menuSetting = new QMenu(this); + QAction *toggleAction = _menuSetting->addAction("显示属性"); + toggleAction->setCheckable(true); + + // 连接菜单项点击事件 + connect(toggleAction, &QAction::triggered, this, [this]() { + _sideBar->setVisible(!_sideBar->isVisible()); + }); + + // 在显示菜单前同步菜单项状态 + connect(_menuSetting, &QMenu::aboutToShow, this, [this, toggleAction]() { + toggleAction->setChecked(_sideBar->isVisible()); + }); + + connect(otherAction, &QAction::triggered, this, [&]() { + QWidget *widget = _toolBar->widgetForAction(otherAction); + if (widget) { + QPoint pos = widget->mapToGlobal(QPoint(0, widget->height())); + _menuSetting->exec(pos); + } else { + _menuSetting->exec(QCursor::pos()); + } + }); + + _toolBar->addAction(otherAction); + // 设置工具栏样式 _toolBar->setToolButtonStyle(Qt::ToolButtonTextOnly); _verticalLayout->setMenuBar(_toolBar); @@ -203,6 +235,18 @@ void MonitorPanel::initMonitorConfig() } +void MonitorPanel::itemSelected(QUuid uid) +{ + _sideBar->getAttributeDlg()->clearAllGroup(); + _sideBar->getAttributeDlg()->generateAttributeGroups(uid); +} + +void MonitorPanel::detailItemSelected(QUuid uid) +{ + _detailAttributeDlg->show(); + _detailAttributeDlg->generateAttributeGroups(uid); +} + void MonitorPanel::onRunClicked() { diff --git a/diagramCavas/source/monitorSelectedItemsDlg.cpp b/diagramCavas/source/monitorSelectedItemsDlg.cpp index 85677e9..a6949f3 100644 --- a/diagramCavas/source/monitorSelectedItemsDlg.cpp +++ b/diagramCavas/source/monitorSelectedItemsDlg.cpp @@ -7,6 +7,7 @@ MonitorSelectedItemsDlg::MonitorSelectedItemsDlg(QWidget* parent) : QDialog(parent) ,_treeView(nullptr) ,_parent(nullptr) + ,_pLayout(nullptr) { _parent = dynamic_cast(parent); initial(); @@ -22,9 +23,22 @@ void MonitorSelectedItemsDlg::initial() _treeView = new QTreeView(this); _treeView->setModel(_parent->getParent()->getLstModel()); _treeView->setHeaderHidden(true); + + _pLayout = new QVBoxLayout(this); + _pLayout->addWidget(_treeView); + connect(_treeView->selectionModel(), &QItemSelectionModel::currentChanged, + this, &MonitorSelectedItemsDlg::onSelectionChanged); } void MonitorSelectedItemsDlg::updateItems() { _treeView->expandAll(); } + +void MonitorSelectedItemsDlg::onSelectionChanged(const QModelIndex ¤t, const QModelIndex &previous) +{ + if(current.isValid()){ + QUuid uid = current.data(Qt::UserRole+3).toUuid(); + _parent->getParent()->getModelController()->monitorItemSelected(uid); + } +} diff --git a/diagramCavas/source/monitorSideBarDlg.cpp b/diagramCavas/source/monitorSideBarDlg.cpp index c62b088..211b096 100644 --- a/diagramCavas/source/monitorSideBarDlg.cpp +++ b/diagramCavas/source/monitorSideBarDlg.cpp @@ -14,7 +14,7 @@ MonitorSideBarDlg::MonitorSideBarDlg(QWidget* parent) _parent = dynamic_cast(parent); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); initial(); - setMinimumWidth(100); + setMinimumWidth(200); } MonitorSideBarDlg::~MonitorSideBarDlg() @@ -33,10 +33,12 @@ void MonitorSideBarDlg::initial() // 创建垂直分割器 QSplitter *splitter = new QSplitter(Qt::Vertical); - splitter->setHandleWidth(2); // 设置分割条宽度 + splitter->setHandleWidth(1); // 设置分割条宽度 splitter->addWidget(_itemsDlg); splitter->addWidget(_attributeDlg); + splitter->setStretchFactor(0, 1); // 第一个部件的拉伸因子为1 + splitter->setStretchFactor(1, 2); // 第二个部件的拉伸因子为3 sideLayout->addWidget(splitter); } diff --git a/diagramCavas/source/monitorToolBox.cpp b/diagramCavas/source/monitorToolBox.cpp index 9df054d..f066106 100644 --- a/diagramCavas/source/monitorToolBox.cpp +++ b/diagramCavas/source/monitorToolBox.cpp @@ -27,8 +27,6 @@ void MonitorToolBox::addWidget(const QString &title, QWidget *pWidget) page->addWidget(title, pWidget); m_pContentVBoxLayout->addWidget(page); - //pLayout->insertWidget(0,page); - //pLayout->addStretch(0); m_mapWidget.insert(title,page); } @@ -55,3 +53,21 @@ void MonitorToolBox::removeWidget(const QString &title) } } + +void MonitorToolBox::removeAllWidget() +{ + for(auto& pWidget:m_mapWidget){ + if(pWidget) + { + MonitorToolPage* toolPage = dynamic_cast(pWidget); + if(toolPage) + { + m_pContentVBoxLayout->removeWidget(toolPage); + delete toolPage; + } + + } + } + + m_mapWidget.clear(); +} diff --git a/diagramCavas/source/util/baseSelector.cpp b/diagramCavas/source/util/baseSelector.cpp index 9c1641f..3c665b1 100644 --- a/diagramCavas/source/util/baseSelector.cpp +++ b/diagramCavas/source/util/baseSelector.cpp @@ -229,6 +229,10 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen setCursor(scene, Qt::ClosedHandCursor); emit setWorkingSelector(ST_moving); } + + auto pPro = item->getProperty(); + if(pPro) + _model->monitorItemSelected(pPro->uuid()); } } else if (items.count() > 1) //选中多个 @@ -655,7 +659,32 @@ void BaseSelector::dropEvent(QGraphicsSceneDragDropEvent *event, DesignerScene*, void BaseSelector::contextMenuEvent(QGraphicsSceneContextMenuEvent *event,DesignerScene* scene,DiagramMode sceneMode) { - QList listItem = scene->selectedItems(); + if(sceneMode == DM_run){ + QList listItem = scene->selectedItems(); + if(listItem.isEmpty()) + return; + QMenu menu; + QAction *detailAttrAction = menu.addAction(QString::fromWCharArray(L"详细属性")); + //connect(removeAction,&QAction::triggered,this,&DesignerScene::onDeleteClicked); + connect(detailAttrAction,&QAction::triggered,this,[&,scene](){ + QList listItem = scene->selectedItems(); + if(listItem.isEmpty()) + return; + else if(listItem.count() == 1) + { + GraphicsProjectModelItem* item = qgraphicsitem_cast(listItem.first()); + if(item) + { + auto pPro = item->getProperty(); + if(pPro){ + _model->monitorItemDetailAttr(pPro->uuid()); + } + } + } + }); + menu.exec(QCursor::pos()); + } + /*QList listItem = scene->selectedItems(); if(listItem.isEmpty()) return; else if(listItem.count() == 1) @@ -682,7 +711,7 @@ void BaseSelector::contextMenuEvent(QGraphicsSceneContextMenuEvent *event,Design } }); menu.exec(QCursor::pos()); - } + }*/ } void BaseSelector::setCursor(DesignerScene *scene, const QCursor &cursor) diff --git a/diagramCavas/ui/monitorDetailAttributeDlg.ui b/diagramCavas/ui/monitorDetailAttributeDlg.ui new file mode 100644 index 0000000..cea7507 --- /dev/null +++ b/diagramCavas/ui/monitorDetailAttributeDlg.ui @@ -0,0 +1,172 @@ + + + monitorDetailAttributeDlg + + + + 0 + 0 + 796 + 543 + + + + + 12 + + + + Dialog + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 16777215 + 21 + + + + background-color: rgb(191, 191, 191); + + + + 0 + + + 0 + + + 0 + + + + + color: rgb(0, 0, 0); +font: 12pt "Microsoft YaHei UI"; + + + 属性详细信息 + + + + + + + Qt::Orientation::Horizontal + + + + 709 + 18 + + + + + + + + + + + 30 + + + 30 + + + + + 调整列数: + + + + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + 退出详情 + + + + + + + + + true + + + + + 0 + 0 + 794 + 497 + + + + + + + + + +