add HMI visibility control

This commit is contained in:
baiYue 2026-04-13 18:13:14 +08:00
parent fda44ec246
commit 8287f5a685
10 changed files with 157 additions and 18 deletions

View File

@ -12,6 +12,8 @@
#include <QFormLayout> #include <QFormLayout>
#include <QFileDialog> #include <QFileDialog>
#include "propertyType/configEventData.h" #include "propertyType/configEventData.h"
#include "dataSourceDlg.h"
#include "propertyType/dataSourceType.h"
class EventPropertyEditor : public QDialog { class EventPropertyEditor : public QDialog {
Q_OBJECT Q_OBJECT
@ -206,15 +208,35 @@ private:
QLineEdit* varNameEdit = new QLineEdit(); QLineEdit* varNameEdit = new QLineEdit();
varNameEdit->setObjectName("varNameEdit"); varNameEdit->setObjectName("varNameEdit");
varNameEdit->setPlaceholderText("输入变量名,如: isVisible"); varNameEdit->setPlaceholderText("变量名");
QPushButton* browseButton = new QPushButton("...");
browseButton->setObjectName("browseButton");
browseButton->setFixedSize(30, 25); // 设置固定大小,保持按钮紧凑
// 创建水平布局,将变量名输入框和按钮放在一起
QHBoxLayout* nameLayout = new QHBoxLayout();
nameLayout->addWidget(varNameEdit);
nameLayout->addWidget(browseButton);
nameLayout->setSpacing(5); // 设置间距
QLineEdit* varValueEdit = new QLineEdit(); QLineEdit* varValueEdit = new QLineEdit();
varValueEdit->setObjectName("varValueEdit"); varValueEdit->setObjectName("varValueEdit");
varValueEdit->setPlaceholderText("输入变量值,如: true, false, 123"); varValueEdit->setPlaceholderText("变量值");
layout->addRow("变量名:", varNameEdit); layout->addRow("变量名:", nameLayout); // 使用水平布局作为行
layout->addRow("变量值:", varValueEdit); layout->addRow("变量值:", varValueEdit);
// 在创建按钮后添加
QObject::connect(browseButton, &QPushButton::clicked, [=]() {
DataSourceDlg dlg;
DataSourceType customType;
dlg.showDlg(customType);
if (dlg.exec() == QDialog::Accepted) {
DataSourceType setType = dlg.getCurData();
varNameEdit->setText(setType.sPara);
}
});
return page; return page;
} }

View File

@ -54,7 +54,7 @@ public:
QMap<QUuid,GraphicsFunctionModelItem*>& allGraphicItems() {return _graphicItem;} QMap<QUuid,GraphicsFunctionModelItem*>& allGraphicItems() {return _graphicItem;}
bool addNodeItem(QUuid uuid,GraphicsFunctionModelItem*); bool addNodeItem(QUuid uuid,GraphicsFunctionModelItem*);
bool addGraphicItem(QUuid uuid,GraphicsFunctionModelItem*); bool addGraphicItem(QUuid uuid,GraphicsFunctionModelItem*);
QString addNodeItem(QUuid id,QPointF pos,double width = 0,double height = 0,double rotate = 0); GraphicsFunctionModelItem* addNodeItem(QUuid id,QPointF pos,double width = 0,double height = 0,double rotate = 0);
GraphicsFunctionModelItem* addGraphicItem(QUuid id,QString name,QPointF pos,int type,QString sContent = "",double width = 0,double height = 0,double rotate = 0); //0图形1文字 GraphicsFunctionModelItem* addGraphicItem(QUuid id,QString name,QPointF pos,int type,QString sContent = "",double width = 0,double height = 0,double rotate = 0); //0图形1文字
GraphicsFunctionModelItem* nodeItem(QUuid uuid); GraphicsFunctionModelItem* nodeItem(QUuid uuid);
BaseProperty* addNodeData(QUuid id,int type,QString name,QString modelName); //对应component数据一个data可对应多个itemid,类型,名称,工程模名) BaseProperty* addNodeData(QUuid id,int type,QString name,QString modelName); //对应component数据一个data可对应多个itemid,类型,名称,工程模名)
@ -153,6 +153,7 @@ public:
void startHttpRequest(); //开始请求数据(运行时) void startHttpRequest(); //开始请求数据(运行时)
void setCavas(QPointer<DiagramCavas> p) {_cavas = p;} //设置所属顶层容器 void setCavas(QPointer<DiagramCavas> p) {_cavas = p;} //设置所属顶层容器
DiagramCavas* getCavas(); DiagramCavas* getCavas();
int getCurMode(); //获取当前模式
QMap<QUuid,GraphicsFunctionModelItem*> getHMIItems(){return _nodeItem;} QMap<QUuid,GraphicsFunctionModelItem*> getHMIItems(){return _nodeItem;}
QMap<QUuid,ElectricBayItem*> getProjectBayItems(){return _bayItem;} QMap<QUuid,ElectricBayItem*> getProjectBayItems(){return _bayItem;}

View File

@ -3,18 +3,36 @@
/*****************自定义图形类*******************/ /*****************自定义图形类*******************/
#include "electricFunctionModelSvgItem.h" #include "electricFunctionModelSvgItem.h"
#include <QFont>
class ElectricFunctionModelSvgItemImage :public ElectricFunctionModelSvgItem class ElectricFunctionModelSvgItemImage :public ElectricFunctionModelSvgItem
{ {
Q_OBJECT Q_OBJECT
public:
Q_PROPERTY(QString Text READ getText WRITE setText)
Q_PROPERTY(QColor TextColor READ getTextColor WRITE setTextColor)
Q_PROPERTY(int TextSize READ getFontSize WRITE setFontSize)
public: public:
ElectricFunctionModelSvgItemImage(const QRect &rect,QGraphicsItem *parent = 0); ElectricFunctionModelSvgItemImage(const QRect &rect,QGraphicsItem *parent = 0);
virtual ~ElectricFunctionModelSvgItemImage(); virtual ~ElectricFunctionModelSvgItemImage();
virtual void setImage_1(QFileInfo) override; virtual void setImage_1(QFileInfo) override;
void setText(const QString& text);
QString getText() {return m_text;}
void setTextColor(const QColor& color) {m_textColor = color;}
QColor getTextColor() {return m_textColor;}
void setFontSize(int n);
int getFontSize() {return m_font.pointSize();}
protected: protected:
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
private: private:
void initial(); void initial();
private:
QString m_text;
QColor m_textColor;
QFont m_font = QFont("Arial", 12);
}; };
#endif #endif

View File

@ -42,7 +42,6 @@ void CreateHMIdlg::onCancelClicked()
void CreateHMIdlg::onSaveClicked() void CreateHMIdlg::onSaveClicked()
{ {
QString sName = ui->cb_structure->currentText(); QString sName = ui->cb_structure->currentText();
if(sName != "") emit createHMI(ui->lineEdit->text(),sName);
emit createHMI(ui->lineEdit->text(),sName);
hide(); hide();
} }

View File

@ -334,10 +334,20 @@ void DiagramCavas::onSignal_loadMonitor(PowerEntity* p)
onSignal_addDrawingPanel(p,DiagramMode::DM_run); onSignal_addDrawingPanel(p,DiagramMode::DM_run);
QJsonObject context = DataBase::GetInstance()->getHMIContextByTag(p->name()); QJsonObject context = DataBase::GetInstance()->getHMIContextByTag(p->name());
m_mapMonitorPanel[p->name()].first->loadNodes(context); m_mapMonitorPanel[p->name()].first->loadNodes(context);
QJsonObject pageObj = context["pageAttr"].toObject();
int x = pageObj["x"].toInt();
int y = pageObj["y"].toInt();
int nWidth = pageObj["width"].toInt();
int nHeight = pageObj["height"].toInt();
if(nWidth && nHeight){
m_mapMonitorPanel[p->name()].second->setGeometry(x,y,nWidth,nHeight);
}
} }
else //已存在 else //已存在
{ {
m_mapMonitorPanel[p->name()].first->show(); m_mapMonitorPanel[p->name()].first->show();
setActiveSubWindow(m_mapMonitorPanel[p->name()].second);
} }
onTargetSelected(m_mapMonitorPanel[p->name()].first->getPropertyProxy()); onTargetSelected(m_mapMonitorPanel[p->name()].first->getPropertyProxy());
} }

View File

@ -260,7 +260,7 @@ GraphicsFunctionModelItem* FixedPortsModel::addGraphicItem(QUuid id,QString name
return item; return item;
} }
QString FixedPortsModel::addNodeItem(QUuid id,QPointF pos,double width,double height,double rotate) GraphicsFunctionModelItem* FixedPortsModel::addNodeItem(QUuid id,QPointF pos,double width,double height,double rotate)
{ {
//todo:load图形时必有拓扑实体关联到对应的entity //todo:load图形时必有拓扑实体关联到对应的entity
@ -276,7 +276,7 @@ QString FixedPortsModel::addNodeItem(QUuid id,QPointF pos,double width,double he
int type = pro->type(); int type = pro->type();
//int type = pro->graphicsType(); //int type = pro->graphicsType();
if(type == 8) //GIT_link 电缆对象外部处理 if(type == 8) //GIT_link 电缆对象外部处理
return QString("err"); return item;
QString sMeta = pro->metaModelName(); QString sMeta = pro->metaModelName();
QString sProModel = pro->modelName(); QString sProModel = pro->modelName();
@ -800,10 +800,10 @@ QString FixedPortsModel::addNodeItem(QUuid id,QPointF pos,double width,double he
connect(item->eventContext().data(),&GraphicsEventContext::variableSet,this,&FixedPortsModel::onVariantSet); connect(item->eventContext().data(),&GraphicsEventContext::variableSet,this,&FixedPortsModel::onVariantSet);
connect(item->eventContext().data(),&GraphicsEventContext::scriptExecuted,this,&FixedPortsModel::onScriptExec); connect(item->eventContext().data(),&GraphicsEventContext::scriptExecuted,this,&FixedPortsModel::onScriptExec);
} }
return pro->name(); return item;
} }
} }
return QString("err"); return item;
} }
BaseProperty* FixedPortsModel::addNodeData(QUuid id,int type,QString name,QString modelName) BaseProperty* FixedPortsModel::addNodeData(QUuid id,int type,QString name,QString modelName)
@ -1798,6 +1798,11 @@ DiagramCavas* FixedPortsModel::getCavas()
return nullptr; return nullptr;
} }
int FixedPortsModel::getCurMode()
{
return _cavas->getCurMode();
}
void FixedPortsModel::addPortsToItem_json(PortState sta,QJsonArray jArr,GraphicsBaseItem* pItem) void FixedPortsModel::addPortsToItem_json(PortState sta,QJsonArray jArr,GraphicsBaseItem* pItem)
{ {
for(QJsonValueRef portJson:jArr) for(QJsonValueRef portJson:jArr)

View File

@ -62,6 +62,10 @@ void ElectricFunctionModelSvgItemImage::paint(QPainter* painter, const QStyleOpt
painter->drawRect(m_boundingRect); painter->drawRect(m_boundingRect);
} }
painter->setFont(m_font);
painter->setPen(m_textColor);
//QRectF textRect = m_boundingRect.adjusted(2, 2, -2, -2);
painter->drawText(m_boundingRect, Qt::AlignCenter, m_text);
ElectricFunctionModelSvgItem::paint(painter,option,widget); ElectricFunctionModelSvgItem::paint(painter,option,widget);
} }
@ -73,3 +77,23 @@ void ElectricFunctionModelSvgItemImage::initial()
setFunctionHandleEnaable(false); setFunctionHandleEnaable(false);
} }
void ElectricFunctionModelSvgItemImage::setText(const QString& text)
{
if (m_text != text) {
m_text = text;
update(); // 触发重绘
// 标记为已修改
setItemChanged(true);
auto pPro = dynamic_cast<GraphicProperty*>(getProperty());
if(pPro){
pPro->setContent(text); //同步修改属性值
}
}
}
void ElectricFunctionModelSvgItemImage::setFontSize(int n)
{
if(n>0 && n <100){
m_font.setPointSize(n);
}
}

View File

@ -9,6 +9,7 @@
#include "graphicsDataModel/fixedPortsModel.h" #include "graphicsDataModel/fixedPortsModel.h"
#include "graphicsItem/functionModelItem/graphicsFunctionModelItem.h" #include "graphicsItem/functionModelItem/graphicsFunctionModelItem.h"
#include "graphicsItem/functionModelItem/electricFunctionModelItemText.h" #include "graphicsItem/functionModelItem/electricFunctionModelItemText.h"
#include "graphicsItem/functionModelItem/electricFunctionModelSvgItemImage.h"
#include "powerEntity.h" #include "powerEntity.h"
#include "statusBar.h" #include "statusBar.h"
#include "baseProperty.h" #include "baseProperty.h"
@ -139,7 +140,14 @@ QJsonObject MonitorPanel::getDiagramInfo()
QJsonArray arr; QJsonArray arr;
if(_pModel) if(_pModel)
{ {
QMap<QUuid,ItemPageInfo> map = _pModel->allNodePos(); QJsonObject pageObj;
pageObj["x"] = pos().x();
pageObj["y"] = pos().y();
pageObj["width"] = width();
pageObj["height"] = height();
obj["pageAttr"] = pageObj;
/*QMap<QUuid,ItemPageInfo> map = _pModel->allNodePos();
for(auto iter = map.begin();iter != map.end();++iter) for(auto iter = map.begin();iter != map.end();++iter)
{ {
QJsonObject node; QJsonObject node;
@ -150,6 +158,22 @@ QJsonObject MonitorPanel::getDiagramInfo()
node["height"] = iter.value().dHeight; node["height"] = iter.value().dHeight;
node["rotate"] = iter.value().dRotate; node["rotate"] = iter.value().dRotate;
arr.append(node); arr.append(node);
}*/
for(auto pItem:_pModel->allItems()){
double dWidth = pItem->boundingRect().width();
double dHeight = pItem->boundingRect().height();
QPointF pos = pItem->scenePos();
double rotation = pItem->rotation();
QJsonObject node;
node["id"] = pItem->itemId().toString();
node["x"] = pos.x();
node["y"] = pos.y();
node["width"] = dWidth;
node["height"] = dHeight;
node["rotate"] = rotation;
node["events"] = pItem->getEvents().toJson();
arr.append(node);
} }
obj["nodes"] = arr; obj["nodes"] = arr;
@ -171,6 +195,7 @@ QJsonObject MonitorPanel::getDiagramInfo()
node["width"] = dWidth; node["width"] = dWidth;
node["height"] = dHeight; node["height"] = dHeight;
node["rotate"] = rotation; node["rotate"] = rotation;
node["events"] = pItem->getEvents().toJson();
GraphicProperty* pPro = dynamic_cast<GraphicProperty*>(pItem->getProperty()); GraphicProperty* pPro = dynamic_cast<GraphicProperty*>(pItem->getProperty());
if(pPro){ if(pPro){
@ -187,6 +212,13 @@ QJsonObject MonitorPanel::getDiagramInfo()
node["fontSize"] = pText->getFontSize(); node["fontSize"] = pText->getFontSize();
} }
} }
else if(pPro->getGraphicType() == 0){ //图像类
auto pImg = dynamic_cast<ElectricFunctionModelSvgItemImage*>(pItem);
if(pImg){
node["color"] = pImg->getTextColor().name();
node["fontSize"] = pImg->getFontSize();
}
}
} }
arrGraphic.append(node); arrGraphic.append(node);
} }
@ -239,8 +271,16 @@ QJsonObject MonitorPanel::getDiagramInfo()
void MonitorPanel::loadNodes(QJsonObject obj) void MonitorPanel::loadNodes(QJsonObject obj)
{ {
QJsonArray nodesJsonArray = obj["nodes"].toArray(); QJsonObject pageObj = obj["pageAttr"].toObject();
int x = pageObj["x"].toInt();
int y = pageObj["y"].toInt();
int nWidth = pageObj["width"].toInt();
int nHeight = pageObj["height"].toInt();
if(nWidth && nHeight){
setGeometry(x,y,nWidth,nHeight);
}
QJsonArray nodesJsonArray = obj["nodes"].toArray();
QList<QPair<QString,QUuid>> lst; QList<QPair<QString,QUuid>> lst;
QList<QUuid> lstId; //通知外部拓扑列表使用 QList<QUuid> lstId; //通知外部拓扑列表使用
for (QJsonValueRef nodeJson : nodesJsonArray) for (QJsonValueRef nodeJson : nodesJsonArray)
@ -252,13 +292,18 @@ void MonitorPanel::loadNodes(QJsonObject obj)
double dWidth = node["width"].toDouble(); double dWidth = node["width"].toDouble();
double dHeight = node["height"].toDouble(); double dHeight = node["height"].toDouble();
double dRotate = node["rotate"].toDouble(); double dRotate = node["rotate"].toDouble();
QJsonArray pageObj = node["events"].toArray();
if(_pModel) if(_pModel)
{ {
QString sName = _pModel->addNodeItem(QUuid(uuid),QPointF(dX,dY),dWidth,dHeight,dRotate); GraphicsFunctionModelItem* pItem = _pModel->addNodeItem(QUuid(uuid),QPointF(dX,dY),dWidth,dHeight,dRotate);
if(sName != "err"){ if(pItem){
lst.append(qMakePair(sName,QUuid(uuid))); auto pPro = pItem->getProperty();
lst.append(qMakePair(pPro->name(),QUuid(uuid)));
lstId.append(QUuid(uuid)); lstId.append(QUuid(uuid));
EventList eventLst; //事件
eventLst.fromJson(pageObj);
pItem->setEvents(eventLst);
} }
} }
} }
@ -286,6 +331,7 @@ void MonitorPanel::loadNodes(QJsonObject obj)
double dWidth = node["width"].toDouble(); double dWidth = node["width"].toDouble();
double dHeight = node["height"].toDouble(); double dHeight = node["height"].toDouble();
double dRotate = node["rotate"].toDouble(); double dRotate = node["rotate"].toDouble();
QJsonArray pageObj = node["events"].toArray();
if(_pModel) if(_pModel)
{ {
@ -302,6 +348,12 @@ void MonitorPanel::loadNodes(QJsonObject obj)
} }
if(!mapData.isEmpty()) if(!mapData.isEmpty())
_pModel->updateCustomById(itemId,mapData); //更新item引用的图片 _pModel->updateCustomById(itemId,mapData); //更新item引用的图片
auto pImg = dynamic_cast<ElectricFunctionModelSvgItemImage*>(pItem);
if(pImg){
pImg->setText(sContent);
pImg->setTextColor(color);
pImg->setFontSize(nFontSize);
}
} }
else if(nType == 1){ //文字类型 else if(nType == 1){ //文字类型
auto pText = dynamic_cast<ElectricFunctionModelItemText*>(pItem); auto pText = dynamic_cast<ElectricFunctionModelItemText*>(pItem);
@ -312,6 +364,9 @@ void MonitorPanel::loadNodes(QJsonObject obj)
pText->setBackColor(backColor); pText->setBackColor(backColor);
} }
} }
EventList eventLst; //事件
eventLst.fromJson(pageObj);
pItem->setEvents(eventLst);
} }
} }
} }

View File

@ -211,7 +211,7 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen
QList<QGraphicsItem *> items = scene->selectedItems(); QList<QGraphicsItem *> items = scene->selectedItems();
if (items.count() == 1) //只有一个选中 if (items.count() == 1) //只有一个选中
{ {
GraphicsProjectModelItem* item = qgraphicsitem_cast<GraphicsProjectModelItem*>(items.first()); GraphicsFunctionModelItem* item = qgraphicsitem_cast<GraphicsFunctionModelItem*>(items.first());
if(item) if(item)
{ {
GraphicsItemType tpe = item->getItemType(); GraphicsItemType tpe = item->getItemType();
@ -231,6 +231,9 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen
auto pPro = item->getProperty(); auto pPro = item->getProperty();
if(pPro) if(pPro)
_model->monitorItemSelected(pPro->uuid()); _model->monitorItemSelected(pPro->uuid());
if(_model->getCurMode() == 1) //运行中
item->triggerEvents("click");
} }
} }
else if (items.count() > 1) //选中多个 else if (items.count() > 1) //选中多个
@ -549,8 +552,10 @@ void BaseSelector::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event, Design
if(pro){ if(pro){
QString modelName = pro->modelName(); QString modelName = pro->modelName();
QUuid uuid = item->itemId(); QUuid uuid = item->itemId();
_model->showModelDlg(modelName,uuid,item); //_model->showModelDlg(modelName,uuid,item);
} }
if(_model->getCurMode() == 1) //运行中
item->triggerEvents("doubleClick");
} }
} }
} }

View File

@ -138,7 +138,7 @@ void DiagramView::onItemChanged(QStandardItem *item)
void DiagramView::onItemClicked(const QModelIndex &index) void DiagramView::onItemClicked(const QModelIndex &index)
{ {
QModelIndex firstIndex = index.sibling(0,index.column()); //取行首item QModelIndex firstIndex = index.sibling(index.row(),0); //取行首item
if(firstIndex.isValid()){ if(firstIndex.isValid()){
QStandardItem* item = _pModel->itemFromIndex(firstIndex); QStandardItem* item = _pModel->itemFromIndex(firstIndex);
QStandardItem* parent = item->parent(); QStandardItem* parent = item->parent();