diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index ad1da09..88ef6cd 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -105,6 +105,8 @@ public: void monitorItemSelected(QUuid); //运行时item选中事件 void monitorItemDetailAttr(QUuid); //显示属性详情 + + void monitorItemSet(QUuid); //运行时item设置完成 Q_SIGNALS: void activatePage(const QString&); //激活当前model所在page void updateCurrentItems(QList,bool); //更新当前组态元件列表 <名称,uid> diff --git a/diagramCavas/include/graphicsItem/graphicsBaseItem.h b/diagramCavas/include/graphicsItem/graphicsBaseItem.h index ebdfd64..832ea38 100644 --- a/diagramCavas/include/graphicsItem/graphicsBaseItem.h +++ b/diagramCavas/include/graphicsItem/graphicsBaseItem.h @@ -140,6 +140,7 @@ class ItemPort; class ModelProperty; class PowerEntity; class AbstractProperty; +class HandleText; typedef AbstractShapeType AbstractShape; @@ -198,6 +199,12 @@ public: virtual bool getPosChanged() {return _posChanged;} virtual void setMoveable(bool b){_bMove = b;} virtual bool getMoveable(){return _bMove;} + virtual void addDynamicText(QString tag,QString para); //动态显示数据 + virtual void removeDynamicText(QString tag); //移除动态显示数据 + virtual void removeAllDynamicText(); + virtual bool hasDynamicText(const QString& tag); + virtual void setDynamicLayoutRadius(qreal radius); + virtual QMap getDynamicText() {return m_mapDynamicText;} int collidesWithHandle(const QPointF& point) { @@ -474,20 +481,27 @@ public: double dParam = dWidth > dHeight ? (dDiagonal-dWidth*0.5):(dDiagonal-dHeight*0.5); m_boundingRect_selected = boundRect.adjusted(-dParam-nMargin, -dParam-nMargin, dParam+nMargin, dParam+nMargin); } + + void rearrangeDynamicItems(); public slots: void onUpdateData(); //data发送的更新通知 +protected: + void rearrangeDynamicText(); //重新设置动态数据的布局 protected: ModelProperty* _property; PowerEntity* _pEntity; //图元拓扑 bool _itemChanged; //图元变化标志,判断是否需要保存 QMap m_mapPort; //单独存放port - + QMap m_mapDynamicText; //单独存放动态数据 QMap m_vecHanle; QPointF m_lastPoint; //鼠标上次点击位置 bool m_touched; //被触碰状态 QRectF m_boundingRect_selected; //选中矩形框 bool _posChanged = false; //位置移动标志 bool _bMove = true; //是否允许移动 + +private: + qreal m_layoutRadius; // 布局半径 (动态数据使用) }; class GraphicsBaseModelItem : public GraphicsBaseItem //基模item diff --git a/diagramCavas/include/graphicsItem/handleText.h b/diagramCavas/include/graphicsItem/handleText.h index a51368a..cca8f53 100644 --- a/diagramCavas/include/graphicsItem/handleText.h +++ b/diagramCavas/include/graphicsItem/handleText.h @@ -4,8 +4,8 @@ #include #include "graphicsItem/itemControlHandle.h" -int const TEXT_WIDTH = 30; -int const TEXT_HEIGHT = 15; +int const TEXT_WIDTH = 80; +int const TEXT_HEIGHT = 40; class QGraphicsProxyWidget; @@ -20,6 +20,13 @@ public: virtual QString getText() const override; void creatEditor(); //创建editor编辑文本 void setEditable(bool b){_editable = b;} + void setIndex(int n) {_nIndex = n;} + int getIndex(){return _nIndex;} + void setTagName(QString s){_sTagName = s;} + QString getTagName(){return _sTagName;} + void setPara(QString s){_sPara = s;} + QString getPara(){return _sPara;} + void setType(int n) {_type = n;} signals: void editFinish(const QString&); protected: @@ -31,6 +38,10 @@ private: QRectF _boundingRect; QGraphicsProxyWidget* _proxy; bool _editable; + int _nIndex; + QString _sTagName; //监控数据的tag + QString _sPara; //监控数据的查询参数 + int _type; //0normal 1dynamic }; #endif diff --git a/diagramCavas/source/diagramEditor/editPanel.cpp b/diagramCavas/source/diagramEditor/editPanel.cpp index 0809724..e13d9a2 100644 --- a/diagramCavas/source/diagramEditor/editPanel.cpp +++ b/diagramCavas/source/diagramEditor/editPanel.cpp @@ -23,6 +23,7 @@ #include "projectManager.h" #include "diagramCavas.h" #include "global.h" +#include "basePropertyManager.h" #include EditPanel::EditPanel(QWidget *parent) @@ -60,7 +61,7 @@ EditPanel::~EditPanel() void EditPanel::initByWizardInfo() { - if(!_lstData.empty()){ + //if(!_lstData.empty() || !_pModel->getPreviewItem().empty()){ _pModel->clearItems(); m_pEditScene->clear(); _lstData.clear(); @@ -70,7 +71,8 @@ void EditPanel::initByWizardInfo() _mainWidget->setLayout(_widgetLayout); m_pEditScene->addItem(_mainWidget); _mainWidget->setGeometry(m_pEditScene->sceneRect()); - } + BasePropertyManager::instance().clearEditorData(); + //} auto& mapTotal = _pEditorWizard->getContainerStruct(); for(auto iter = mapTotal.begin();iter != mapTotal.end();++iter){ if(iter.key() == g_transformerLevel) diff --git a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp index 8aaadee..9902e1d 100644 --- a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp +++ b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp @@ -465,6 +465,7 @@ void DiagramEditorModel::linkTransItem(GraphicsBaseModelItem* pTrans,QStandardIt void DiagramEditorModel::generatePreview() { if(_pPanel){ + clearItems(); _pPanel->showPreview(); QList lst = _pPanel->getBlockItems(); QMap> baysCompo; diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index fe74f1b..c7c963e 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -2742,3 +2742,46 @@ void FixedPortsModel::monitorItemDetailAttr(QUuid uid) pMonitor->detailItemSelected(uid); } } + +void FixedPortsModel::monitorItemSet(QUuid uid) +{ + if(_nodeItem.contains(uid)){ + //QList lstRemove; //需要从item移除的动态数据 + QList lstAdd; //需要向item添加的动态数据 + + auto pItem = _nodeItem.value(uid); + auto lst = m_monitorPara.value(uid); + //auto mapText = pItem->getDynamicText(); + + /*for(auto iter = mapText.begin();iter != mapText.end();++iter){ + bool exist = false; + for(auto& info:lst){ + if(info.sTag == iter.key()){ //新旧队列都存在 + exist = true; + } + } + if(!exist) + lstRemove.append(iter.key()); + }*/ + + for(auto& info:lst){ + if(info.bShowDiagram && info.bSelected){ + lstAdd.append(info.sTag); + } + } + + /*for(auto& str:lstRemove){ + pItem->removeDynamicText(str); + }*/ + pItem->removeAllDynamicText(); + + for(auto& str:lstAdd){ + for(auto& info:lst){ + if(info.sTag == str){ + pItem->addDynamicText(info.sTag,info.sConnectPara); + continue; + } + } + } + } +} diff --git a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp index e5a7b6f..49fbae5 100644 --- a/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp +++ b/diagramCavas/source/graphicsItem/graphicsBaseItem.cpp @@ -21,6 +21,7 @@ GraphicsBaseItem::GraphicsBaseItem(QGraphicsItem *parent) setFlag(QGraphicsItem::ItemIsSelectable, true); setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); setAcceptHoverEvents(true); + m_layoutRadius = 80; } GraphicsBaseItem::GraphicsBaseItem(const GraphicsBaseItem& obj) @@ -36,6 +37,8 @@ GraphicsBaseItem::GraphicsBaseItem(const GraphicsBaseItem& obj) setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); setAcceptHoverEvents(true); + m_layoutRadius = 80; + m_lastPoint = obj.m_lastPoint; m_touched = obj.m_touched; m_boundingRect_selected = obj.m_boundingRect_selected; @@ -224,6 +227,99 @@ void GraphicsBaseItem::initialPortsByDatabase(int nComponentTypeId) } } } + +void GraphicsBaseItem::addDynamicText(QString tag,QString para) +{ + int ntagId = -1; + for(ntagId = H_textCaption+1;ntagId < H_connect;++ntagId) //添加到未占用位置 + { + if(!m_vecHanle.contains(ntagId)) + break; + } + HandleText* pText = new HandleText(this); + pText->setEditable(false); + pText->setIndex(ntagId); + pText->setTagName(tag); + pText->setType(1); + m_vecHanle.insert(ntagId,pText); + + m_mapDynamicText.insert(tag,pText); + rearrangeDynamicText(); +} + +void GraphicsBaseItem::removeDynamicText(QString tag) +{ + for(auto& pText:m_mapDynamicText){ + if(pText->getTagName() == tag){ + int nIndex = pText->getIndex(); + m_vecHanle.remove(nIndex); + auto p = m_mapDynamicText.take(tag); + delete p; + return; + } + } + rearrangeDynamicText(); +} + +void GraphicsBaseItem::removeAllDynamicText() +{ + for(auto iter = m_mapDynamicText.begin();iter != m_mapDynamicText.end();++iter){ + int nIndex = iter.value()->getIndex(); + m_vecHanle.remove(nIndex); + //auto p = m_mapDynamicText.take(iter.key()); + //delete p; + } + qDeleteAll(m_mapDynamicText); + m_mapDynamicText.clear(); +} + +bool GraphicsBaseItem::hasDynamicText(const QString& tag) +{ + for(auto& pText:m_mapDynamicText){ + if(pText->getTagName() == tag){ + return true; + } + } + return false; +} + +void GraphicsBaseItem::setDynamicLayoutRadius(qreal radius) +{ + m_layoutRadius = radius; + rearrangeDynamicText(); +} + + +void GraphicsBaseItem::rearrangeDynamicText() +{ + int count = m_mapDynamicText.size(); + if (count == 0) return; + + // 计算左右两侧的项数 + int leftCount = (count + 1) / 2; // 左侧稍多 + int rightCount = count - leftCount; + + qreal itemHeight = 30; + qreal startY = -((qMax(leftCount, rightCount) - 1) * itemHeight) / 2; + + int i = 0; + for (auto& item : m_mapDynamicText) { + qreal x, y; + + if (i < leftCount) { + // 左侧排列 + x = -m_layoutRadius-20; // 左侧偏移多一点 + y = startY + i * itemHeight; + } else { + // 右侧排列 + x = m_layoutRadius; // 右侧偏移 + y = startY + (i - leftCount) * itemHeight; + } + + item->setPos(x, y); + ++i; + } +} /********************************基模****************************************/ GraphicsBaseModelItem::GraphicsBaseModelItem(QGraphicsItem *parent) :GraphicsBaseItem(parent) diff --git a/diagramCavas/source/graphicsItem/handleText.cpp b/diagramCavas/source/graphicsItem/handleText.cpp index 260b739..d22f748 100644 --- a/diagramCavas/source/graphicsItem/handleText.cpp +++ b/diagramCavas/source/graphicsItem/handleText.cpp @@ -7,6 +7,8 @@ HandleText::HandleText(QGraphicsItem *parent) : ItemControlHandle(parent) ,_font(QFont()) ,_proxy(nullptr) + ,_nIndex(-1) + ,_type(0) { _editable = true; _boundingRect = QRectF(-TEXT_WIDTH*0.5,-TEXT_WIDTH*0.5,TEXT_WIDTH,TEXT_HEIGHT); @@ -65,7 +67,13 @@ void HandleText::paint(QPainter* painter, const QStyleOptionGraphicsItem* option painter->setRenderHint(QPainter::TextAntialiasing, true); int w = _boundingRect.width(); int h = _boundingRect.height(); - painter->drawText(QPointF(-w*0.5,h*0.5),_text); + if(_type == 0) + painter->drawText(QPointF(-w*0.5,h*0.5),_text); + else{ + QString displayText = _sTagName + ":" + _text; + painter->drawText(boundingRect(), Qt::AlignCenter, displayText); + } + } QRectF HandleText::boundingRect() const diff --git a/diagramCavas/source/monitorAttributeDlg.cpp b/diagramCavas/source/monitorAttributeDlg.cpp index 646393a..bbf3fd5 100644 --- a/diagramCavas/source/monitorAttributeDlg.cpp +++ b/diagramCavas/source/monitorAttributeDlg.cpp @@ -4,6 +4,7 @@ #include "monitorToolBox.h" #include "monitorSideBarDlg.h" #include +#include #include "global.h" MonitorAttributeDlg::MonitorAttributeDlg(QWidget* parent) @@ -23,9 +24,25 @@ MonitorAttributeDlg::~MonitorAttributeDlg() void MonitorAttributeDlg::initial() { + // 创建标题栏 + QWidget *titleBar = new QWidget(this); + titleBar->setFixedHeight(21); + titleBar->setStyleSheet("background-color: #2b579a; color: white;"); + + // 标题栏布局 + QHBoxLayout *titleLayout = new QHBoxLayout(titleBar); + titleLayout->setContentsMargins(10, 0, 5, 0); + + // 标题标签 + QLabel *titleLabel = new QLabel("对象属性"); + titleLabel->setStyleSheet("color: white; font-weight: bold;"); + + titleLayout->addWidget(titleLabel); + _pLayout = new QVBoxLayout(this); _pBox = new MonitorToolBox(this); _pBox->setContentsMargins(0, 0, 0, 0); + _pLayout->addWidget(titleBar); _pLayout->addWidget(_pBox); } diff --git a/diagramCavas/source/monitorAttributeGroupDlg.cpp b/diagramCavas/source/monitorAttributeGroupDlg.cpp index 52ef1f7..9152f26 100644 --- a/diagramCavas/source/monitorAttributeGroupDlg.cpp +++ b/diagramCavas/source/monitorAttributeGroupDlg.cpp @@ -38,9 +38,9 @@ void MonitorAttributeGroupDlg::createGroupView(QList l { QWidget* content = new QWidget(); QGridLayout* gridLayout = new QGridLayout(content); - gridLayout->setHorizontalSpacing(20); - gridLayout->setVerticalSpacing(12); - //gridLayout->setContentsMargins(12, 12, 12, 12); + gridLayout->setHorizontalSpacing(6); + gridLayout->setVerticalSpacing(10); + gridLayout->setContentsMargins(0, 0, 0, 0); // 设置列的最小宽度和拉伸比例 gridLayout->setColumnMinimumWidth(0, 30); // 标签列最小宽度 @@ -85,6 +85,7 @@ QWidget* MonitorAttributeGroupDlg::createEditor(monitorItemAttributeInfo info) } else{ //图表 QChartView* chartView = new QChartView(this); + chartView->setMinimumSize(400, 300); chartView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); chartView->setRenderHint(QPainter::Antialiasing); @@ -95,6 +96,9 @@ QWidget* MonitorAttributeGroupDlg::createEditor(monitorItemAttributeInfo info) // 创建折线序列 QLineSeries* series = new QLineSeries(); + QFont axisFont; + axisFont.setPointSize(9); + // 创建图表 chart->addSeries(series); chart->setTitle(info.sName); @@ -110,10 +114,6 @@ QWidget* MonitorAttributeGroupDlg::createEditor(monitorItemAttributeInfo info) QValueAxis* axisX = new QValueAxis(); QValueAxis* axisY = new QValueAxis(); - // 设置坐标轴标题 - axisX->setTitleText("时间"); - axisY->setTitleText("值"); - // 添加坐标轴到图表 chart->addAxis(axisX, Qt::AlignBottom); chart->addAxis(axisY, Qt::AlignLeft); @@ -126,9 +126,21 @@ QWidget* MonitorAttributeGroupDlg::createEditor(monitorItemAttributeInfo info) axisX->setRange(0, 10); // 临时范围 axisY->setRange(0, 100); + // 设置坐标轴标题 + axisX->setTitleText("时间"); + axisX->setLabelsFont(axisFont); + axisX->setTitleFont(axisFont); + axisY->setTitleText("值"); + axisY->setLabelsFont(axisFont); + axisY->setTitleFont(axisFont); + chart->setTheme(QChart::ChartThemeLight); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); + + QFont legendFont = chart->legend()->font(); + legendFont.setPointSize(8); // 设置图例字体大小 + chart->legend()->setFont(legendFont); } else if (info.nGraphType == 1) { QBarSeries* series = new QBarSeries(); diff --git a/diagramCavas/source/monitorConfigDlg.cpp b/diagramCavas/source/monitorConfigDlg.cpp index d8b0683..022bb00 100644 --- a/diagramCavas/source/monitorConfigDlg.cpp +++ b/diagramCavas/source/monitorConfigDlg.cpp @@ -51,6 +51,7 @@ void MonitorConfigDlg::onOkClicked() savePropertyData(ui->treeView_para->currentIndex(),_curUuid); } _parent->getModelController()->getMonitorPara() = _tempConfig; //保存临时数据 + _parent->getModelController()->monitorItemSet(_curUuid); hide(); } diff --git a/diagramCavas/source/monitorSelectedItemsDlg.cpp b/diagramCavas/source/monitorSelectedItemsDlg.cpp index a6949f3..beb582b 100644 --- a/diagramCavas/source/monitorSelectedItemsDlg.cpp +++ b/diagramCavas/source/monitorSelectedItemsDlg.cpp @@ -1,7 +1,8 @@ #include "monitorSelectedItemsDlg.h" #include "monitorSideBarDlg.h" #include "monitorPanel.h" -#include "global.h" +#include + MonitorSelectedItemsDlg::MonitorSelectedItemsDlg(QWidget* parent) : QDialog(parent) @@ -24,7 +25,22 @@ void MonitorSelectedItemsDlg::initial() _treeView->setModel(_parent->getParent()->getLstModel()); _treeView->setHeaderHidden(true); + // 创建标题栏 + QWidget *titleBar = new QWidget(this); + titleBar->setFixedHeight(21); + titleBar->setStyleSheet("background-color: #2b579a; color: white;"); + + // 标题栏布局 + QHBoxLayout *titleLayout = new QHBoxLayout(titleBar); + titleLayout->setContentsMargins(10, 0, 5, 0); + + // 标题标签 + QLabel *titleLabel = new QLabel("图元列表"); + titleLabel->setStyleSheet("color: white; font-weight: bold;"); + + titleLayout->addWidget(titleLabel); _pLayout = new QVBoxLayout(this); + _pLayout->addWidget(titleBar); _pLayout->addWidget(_treeView); connect(_treeView->selectionModel(), &QItemSelectionModel::currentChanged, this, &MonitorSelectedItemsDlg::onSelectionChanged); diff --git a/diagramCavas/source/monitorSideBarDlg.cpp b/diagramCavas/source/monitorSideBarDlg.cpp index 211b096..1c6a44e 100644 --- a/diagramCavas/source/monitorSideBarDlg.cpp +++ b/diagramCavas/source/monitorSideBarDlg.cpp @@ -39,6 +39,6 @@ void MonitorSideBarDlg::initial() splitter->addWidget(_attributeDlg); splitter->setStretchFactor(0, 1); // 第一个部件的拉伸因子为1 - splitter->setStretchFactor(1, 2); // 第二个部件的拉伸因子为3 + splitter->setStretchFactor(1, 3); // 第二个部件的拉伸因子为3 sideLayout->addWidget(splitter); }