add monitor diagram dynamic para

This commit is contained in:
baiYue 2025-11-26 20:33:13 +08:00
parent fb814b65a5
commit 7cb676d940
13 changed files with 238 additions and 15 deletions

View File

@ -105,6 +105,8 @@ public:
void monitorItemSelected(QUuid); //运行时item选中事件 void monitorItemSelected(QUuid); //运行时item选中事件
void monitorItemDetailAttr(QUuid); //显示属性详情 void monitorItemDetailAttr(QUuid); //显示属性详情
void monitorItemSet(QUuid); //运行时item设置完成
Q_SIGNALS: Q_SIGNALS:
void activatePage(const QString&); //激活当前model所在page void activatePage(const QString&); //激活当前model所在page
void updateCurrentItems(QList<monitorRelationItem>,bool); //更新当前组态元件列表 <名称,uid> void updateCurrentItems(QList<monitorRelationItem>,bool); //更新当前组态元件列表 <名称,uid>

View File

@ -140,6 +140,7 @@ class ItemPort;
class ModelProperty; class ModelProperty;
class PowerEntity; class PowerEntity;
class AbstractProperty; class AbstractProperty;
class HandleText;
typedef AbstractShapeType<QGraphicsItem> AbstractShape; typedef AbstractShapeType<QGraphicsItem> AbstractShape;
@ -198,6 +199,12 @@ public:
virtual bool getPosChanged() {return _posChanged;} virtual bool getPosChanged() {return _posChanged;}
virtual void setMoveable(bool b){_bMove = b;} virtual void setMoveable(bool b){_bMove = b;}
virtual bool getMoveable(){return _bMove;} 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<QString,HandleText*> getDynamicText() {return m_mapDynamicText;}
int collidesWithHandle(const QPointF& point) int collidesWithHandle(const QPointF& point)
{ {
@ -474,20 +481,27 @@ public:
double dParam = dWidth > dHeight ? (dDiagonal-dWidth*0.5):(dDiagonal-dHeight*0.5); 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); m_boundingRect_selected = boundRect.adjusted(-dParam-nMargin, -dParam-nMargin, dParam+nMargin, dParam+nMargin);
} }
void rearrangeDynamicItems();
public slots: public slots:
void onUpdateData(); //data发送的更新通知 void onUpdateData(); //data发送的更新通知
protected:
void rearrangeDynamicText(); //重新设置动态数据的布局
protected: protected:
ModelProperty* _property; ModelProperty* _property;
PowerEntity* _pEntity; //图元拓扑 PowerEntity* _pEntity; //图元拓扑
bool _itemChanged; //图元变化标志,判断是否需要保存 bool _itemChanged; //图元变化标志,判断是否需要保存
QMap<QString,ItemPort*> m_mapPort; //单独存放port QMap<QString,ItemPort*> m_mapPort; //单独存放port
QMap<QString,HandleText*> m_mapDynamicText; //单独存放动态数据
QMap<int,ItemControlHandle*> m_vecHanle; QMap<int,ItemControlHandle*> m_vecHanle;
QPointF m_lastPoint; //鼠标上次点击位置 QPointF m_lastPoint; //鼠标上次点击位置
bool m_touched; //被触碰状态 bool m_touched; //被触碰状态
QRectF m_boundingRect_selected; //选中矩形框 QRectF m_boundingRect_selected; //选中矩形框
bool _posChanged = false; //位置移动标志 bool _posChanged = false; //位置移动标志
bool _bMove = true; //是否允许移动 bool _bMove = true; //是否允许移动
private:
qreal m_layoutRadius; // 布局半径 (动态数据使用)
}; };
class GraphicsBaseModelItem : public GraphicsBaseItem //基模item class GraphicsBaseModelItem : public GraphicsBaseItem //基模item

View File

@ -4,8 +4,8 @@
#include <QFont> #include <QFont>
#include "graphicsItem/itemControlHandle.h" #include "graphicsItem/itemControlHandle.h"
int const TEXT_WIDTH = 30; int const TEXT_WIDTH = 80;
int const TEXT_HEIGHT = 15; int const TEXT_HEIGHT = 40;
class QGraphicsProxyWidget; class QGraphicsProxyWidget;
@ -20,6 +20,13 @@ public:
virtual QString getText() const override; virtual QString getText() const override;
void creatEditor(); //创建editor编辑文本 void creatEditor(); //创建editor编辑文本
void setEditable(bool b){_editable = b;} 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: signals:
void editFinish(const QString&); void editFinish(const QString&);
protected: protected:
@ -31,6 +38,10 @@ private:
QRectF _boundingRect; QRectF _boundingRect;
QGraphicsProxyWidget* _proxy; QGraphicsProxyWidget* _proxy;
bool _editable; bool _editable;
int _nIndex;
QString _sTagName; //监控数据的tag
QString _sPara; //监控数据的查询参数
int _type; //0normal 1dynamic
}; };
#endif #endif

View File

@ -23,6 +23,7 @@
#include "projectManager.h" #include "projectManager.h"
#include "diagramCavas.h" #include "diagramCavas.h"
#include "global.h" #include "global.h"
#include "basePropertyManager.h"
#include <QDebug> #include <QDebug>
EditPanel::EditPanel(QWidget *parent) EditPanel::EditPanel(QWidget *parent)
@ -60,7 +61,7 @@ EditPanel::~EditPanel()
void EditPanel::initByWizardInfo() void EditPanel::initByWizardInfo()
{ {
if(!_lstData.empty()){ //if(!_lstData.empty() || !_pModel->getPreviewItem().empty()){
_pModel->clearItems(); _pModel->clearItems();
m_pEditScene->clear(); m_pEditScene->clear();
_lstData.clear(); _lstData.clear();
@ -70,7 +71,8 @@ void EditPanel::initByWizardInfo()
_mainWidget->setLayout(_widgetLayout); _mainWidget->setLayout(_widgetLayout);
m_pEditScene->addItem(_mainWidget); m_pEditScene->addItem(_mainWidget);
_mainWidget->setGeometry(m_pEditScene->sceneRect()); _mainWidget->setGeometry(m_pEditScene->sceneRect());
} BasePropertyManager::instance().clearEditorData();
//}
auto& mapTotal = _pEditorWizard->getContainerStruct(); auto& mapTotal = _pEditorWizard->getContainerStruct();
for(auto iter = mapTotal.begin();iter != mapTotal.end();++iter){ for(auto iter = mapTotal.begin();iter != mapTotal.end();++iter){
if(iter.key() == g_transformerLevel) if(iter.key() == g_transformerLevel)

View File

@ -465,6 +465,7 @@ void DiagramEditorModel::linkTransItem(GraphicsBaseModelItem* pTrans,QStandardIt
void DiagramEditorModel::generatePreview() void DiagramEditorModel::generatePreview()
{ {
if(_pPanel){ if(_pPanel){
clearItems();
_pPanel->showPreview(); _pPanel->showPreview();
QList<EditBaseItem*> lst = _pPanel->getBlockItems(); QList<EditBaseItem*> lst = _pPanel->getBlockItems();
QMap<QString,QList<DiagramEditorComponentInfo>> baysCompo; QMap<QString,QList<DiagramEditorComponentInfo>> baysCompo;

View File

@ -2742,3 +2742,46 @@ void FixedPortsModel::monitorItemDetailAttr(QUuid uid)
pMonitor->detailItemSelected(uid); pMonitor->detailItemSelected(uid);
} }
} }
void FixedPortsModel::monitorItemSet(QUuid uid)
{
if(_nodeItem.contains(uid)){
//QList<QString> lstRemove; //需要从item移除的动态数据
QList<QString> 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;
}
}
}
}
}

View File

@ -21,6 +21,7 @@ GraphicsBaseItem::GraphicsBaseItem(QGraphicsItem *parent)
setFlag(QGraphicsItem::ItemIsSelectable, true); setFlag(QGraphicsItem::ItemIsSelectable, true);
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
m_layoutRadius = 80;
} }
GraphicsBaseItem::GraphicsBaseItem(const GraphicsBaseItem& obj) GraphicsBaseItem::GraphicsBaseItem(const GraphicsBaseItem& obj)
@ -36,6 +37,8 @@ GraphicsBaseItem::GraphicsBaseItem(const GraphicsBaseItem& obj)
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
m_layoutRadius = 80;
m_lastPoint = obj.m_lastPoint; m_lastPoint = obj.m_lastPoint;
m_touched = obj.m_touched; m_touched = obj.m_touched;
m_boundingRect_selected = obj.m_boundingRect_selected; 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) GraphicsBaseModelItem::GraphicsBaseModelItem(QGraphicsItem *parent)
:GraphicsBaseItem(parent) :GraphicsBaseItem(parent)

View File

@ -7,6 +7,8 @@ HandleText::HandleText(QGraphicsItem *parent)
: ItemControlHandle(parent) : ItemControlHandle(parent)
,_font(QFont()) ,_font(QFont())
,_proxy(nullptr) ,_proxy(nullptr)
,_nIndex(-1)
,_type(0)
{ {
_editable = true; _editable = true;
_boundingRect = QRectF(-TEXT_WIDTH*0.5,-TEXT_WIDTH*0.5,TEXT_WIDTH,TEXT_HEIGHT); _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); painter->setRenderHint(QPainter::TextAntialiasing, true);
int w = _boundingRect.width(); int w = _boundingRect.width();
int h = _boundingRect.height(); int h = _boundingRect.height();
if(_type == 0)
painter->drawText(QPointF(-w*0.5,h*0.5),_text); 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 QRectF HandleText::boundingRect() const

View File

@ -4,6 +4,7 @@
#include "monitorToolBox.h" #include "monitorToolBox.h"
#include "monitorSideBarDlg.h" #include "monitorSideBarDlg.h"
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QLabel>
#include "global.h" #include "global.h"
MonitorAttributeDlg::MonitorAttributeDlg(QWidget* parent) MonitorAttributeDlg::MonitorAttributeDlg(QWidget* parent)
@ -23,9 +24,25 @@ MonitorAttributeDlg::~MonitorAttributeDlg()
void MonitorAttributeDlg::initial() 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); _pLayout = new QVBoxLayout(this);
_pBox = new MonitorToolBox(this); _pBox = new MonitorToolBox(this);
_pBox->setContentsMargins(0, 0, 0, 0); _pBox->setContentsMargins(0, 0, 0, 0);
_pLayout->addWidget(titleBar);
_pLayout->addWidget(_pBox); _pLayout->addWidget(_pBox);
} }

View File

@ -38,9 +38,9 @@ void MonitorAttributeGroupDlg::createGroupView(QList<monitorItemAttributeInfo> l
{ {
QWidget* content = new QWidget(); QWidget* content = new QWidget();
QGridLayout* gridLayout = new QGridLayout(content); QGridLayout* gridLayout = new QGridLayout(content);
gridLayout->setHorizontalSpacing(20); gridLayout->setHorizontalSpacing(6);
gridLayout->setVerticalSpacing(12); gridLayout->setVerticalSpacing(10);
//gridLayout->setContentsMargins(12, 12, 12, 12); gridLayout->setContentsMargins(0, 0, 0, 0);
// 设置列的最小宽度和拉伸比例 // 设置列的最小宽度和拉伸比例
gridLayout->setColumnMinimumWidth(0, 30); // 标签列最小宽度 gridLayout->setColumnMinimumWidth(0, 30); // 标签列最小宽度
@ -85,6 +85,7 @@ QWidget* MonitorAttributeGroupDlg::createEditor(monitorItemAttributeInfo info)
} }
else{ //图表 else{ //图表
QChartView* chartView = new QChartView(this); QChartView* chartView = new QChartView(this);
chartView->setMinimumSize(400, 300);
chartView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); chartView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
chartView->setRenderHint(QPainter::Antialiasing); chartView->setRenderHint(QPainter::Antialiasing);
@ -95,6 +96,9 @@ QWidget* MonitorAttributeGroupDlg::createEditor(monitorItemAttributeInfo info)
// 创建折线序列 // 创建折线序列
QLineSeries* series = new QLineSeries(); QLineSeries* series = new QLineSeries();
QFont axisFont;
axisFont.setPointSize(9);
// 创建图表 // 创建图表
chart->addSeries(series); chart->addSeries(series);
chart->setTitle(info.sName); chart->setTitle(info.sName);
@ -110,10 +114,6 @@ QWidget* MonitorAttributeGroupDlg::createEditor(monitorItemAttributeInfo info)
QValueAxis* axisX = new QValueAxis(); QValueAxis* axisX = new QValueAxis();
QValueAxis* axisY = new QValueAxis(); QValueAxis* axisY = new QValueAxis();
// 设置坐标轴标题
axisX->setTitleText("时间");
axisY->setTitleText("");
// 添加坐标轴到图表 // 添加坐标轴到图表
chart->addAxis(axisX, Qt::AlignBottom); chart->addAxis(axisX, Qt::AlignBottom);
chart->addAxis(axisY, Qt::AlignLeft); chart->addAxis(axisY, Qt::AlignLeft);
@ -126,9 +126,21 @@ QWidget* MonitorAttributeGroupDlg::createEditor(monitorItemAttributeInfo info)
axisX->setRange(0, 10); // 临时范围 axisX->setRange(0, 10); // 临时范围
axisY->setRange(0, 100); 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->setTheme(QChart::ChartThemeLight);
chart->legend()->setVisible(true); chart->legend()->setVisible(true);
chart->legend()->setAlignment(Qt::AlignBottom); chart->legend()->setAlignment(Qt::AlignBottom);
QFont legendFont = chart->legend()->font();
legendFont.setPointSize(8); // 设置图例字体大小
chart->legend()->setFont(legendFont);
} }
else if (info.nGraphType == 1) { else if (info.nGraphType == 1) {
QBarSeries* series = new QBarSeries(); QBarSeries* series = new QBarSeries();

View File

@ -51,6 +51,7 @@ void MonitorConfigDlg::onOkClicked()
savePropertyData(ui->treeView_para->currentIndex(),_curUuid); savePropertyData(ui->treeView_para->currentIndex(),_curUuid);
} }
_parent->getModelController()->getMonitorPara() = _tempConfig; //保存临时数据 _parent->getModelController()->getMonitorPara() = _tempConfig; //保存临时数据
_parent->getModelController()->monitorItemSet(_curUuid);
hide(); hide();
} }

View File

@ -1,7 +1,8 @@
#include "monitorSelectedItemsDlg.h" #include "monitorSelectedItemsDlg.h"
#include "monitorSideBarDlg.h" #include "monitorSideBarDlg.h"
#include "monitorPanel.h" #include "monitorPanel.h"
#include "global.h" #include <QLabel>
MonitorSelectedItemsDlg::MonitorSelectedItemsDlg(QWidget* parent) MonitorSelectedItemsDlg::MonitorSelectedItemsDlg(QWidget* parent)
: QDialog(parent) : QDialog(parent)
@ -24,7 +25,22 @@ void MonitorSelectedItemsDlg::initial()
_treeView->setModel(_parent->getParent()->getLstModel()); _treeView->setModel(_parent->getParent()->getLstModel());
_treeView->setHeaderHidden(true); _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 = new QVBoxLayout(this);
_pLayout->addWidget(titleBar);
_pLayout->addWidget(_treeView); _pLayout->addWidget(_treeView);
connect(_treeView->selectionModel(), &QItemSelectionModel::currentChanged, connect(_treeView->selectionModel(), &QItemSelectionModel::currentChanged,
this, &MonitorSelectedItemsDlg::onSelectionChanged); this, &MonitorSelectedItemsDlg::onSelectionChanged);

View File

@ -39,6 +39,6 @@ void MonitorSideBarDlg::initial()
splitter->addWidget(_attributeDlg); splitter->addWidget(_attributeDlg);
splitter->setStretchFactor(0, 1); // 第一个部件的拉伸因子为1 splitter->setStretchFactor(0, 1); // 第一个部件的拉伸因子为1
splitter->setStretchFactor(1, 2); // 第二个部件的拉伸因子为3 splitter->setStretchFactor(1, 3); // 第二个部件的拉伸因子为3
sideLayout->addWidget(splitter); sideLayout->addWidget(splitter);
} }