From 665635e839d90648ed5a1d9accfb507bb23c004b Mon Sep 17 00:00:00 2001 From: baiYue Date: Wed, 6 May 2026 08:51:47 +0800 Subject: [PATCH] add auto expand logic --- customTypePlugin/source/reactorItem.cpp | 4 +- diagramCavas/CMakeLists.txt | 2 + diagramCavas/include/diagramCavas.h | 1 + diagramCavas/include/diagramCavas_p.h | 2 + .../graphicsDataModel/fixedPortsModel.h | 2 + .../electricFunctionModelSvgItemCT.h | 3 + .../electricFunctionModelSvgItemPT.h | 3 + .../graphicsFunctionModelItem.h | 6 ++ .../include/graphicsItem/itemExtend.h | 30 ++++++++++ diagramCavas/include/util/baseSelector.h | 6 +- diagramCavas/include/util/subMovingSelector.h | 2 +- diagramCavas/source/designerScene.cpp | 1 + diagramCavas/source/diagramCavas.cpp | 6 ++ .../graphicsDataModel/fixedPortsModel.cpp | 55 +++++++++++++++++++ .../electricFunctionModelSvgGroupCT.cpp | 2 + .../electricFunctionModelSvgGroupPT.cpp | 1 + .../electricFunctionModelSvgItemCT.cpp | 23 ++++++++ .../electricFunctionModelSvgItemPT.cpp | 26 +++++++++ .../graphicsFunctionModelItem.cpp | 35 ++++++++++++ .../source/graphicsItem/itemExtend.cpp | 50 +++++++++++++++++ diagramCavas/source/util/baseSelector.cpp | 22 ++++++++ .../source/util/subMovingSelector.cpp | 3 +- source/mainwindow.cpp | 1 + ui/mainwindow.ui | 18 ++++++ 24 files changed, 297 insertions(+), 7 deletions(-) create mode 100644 diagramCavas/include/graphicsItem/itemExtend.h create mode 100644 diagramCavas/source/graphicsItem/itemExtend.cpp diff --git a/customTypePlugin/source/reactorItem.cpp b/customTypePlugin/source/reactorItem.cpp index 0adf629..ac0b6d3 100644 --- a/customTypePlugin/source/reactorItem.cpp +++ b/customTypePlugin/source/reactorItem.cpp @@ -43,7 +43,7 @@ void ReactorItem::draw(QPainter *painter, const QRectF &rect) painter->setPen(pen); painter->setBrush(brush); - // 绘制矩形 + /*// 绘制矩形 if (m_cornerRadius > 0) { painter->drawRoundedRect(rect, m_cornerRadius, m_cornerRadius); } else { @@ -63,7 +63,7 @@ void ReactorItem::draw(QPainter *painter, const QRectF &rect) Qt::AlignLeft | Qt::AlignTop, sizeText); painter->restore(); - } + }*/ painter->restore(); } diff --git a/diagramCavas/CMakeLists.txt b/diagramCavas/CMakeLists.txt index a0344c7..d459630 100644 --- a/diagramCavas/CMakeLists.txt +++ b/diagramCavas/CMakeLists.txt @@ -65,6 +65,7 @@ set(DIAGRAMCAVAS_HEADER_FILES include/graphicsItem/handleRect.h include/graphicsItem/handleText.h include/graphicsItem/itemPort.h + include/graphicsItem/itemExtend.h include/graphicsItem/electricBayItem.h include/graphicsItem/itemControlHandle.h include/graphicsItem/graphicsBaseItem.h @@ -211,6 +212,7 @@ set(DIAGRAMCAVAS_SOURCE_FILES source/graphicsItem/handleRect.cpp source/graphicsItem/handleText.cpp source/graphicsItem/itemPort.cpp + source/graphicsItem/itemExtend.cpp source/graphicsItem/electricBayItem.cpp source/graphicsItem/itemControlHandle.cpp source/graphicsItem/graphicsBaseItem.cpp diff --git a/diagramCavas/include/diagramCavas.h b/diagramCavas/include/diagramCavas.h index 22661c9..fb8af48 100644 --- a/diagramCavas/include/diagramCavas.h +++ b/diagramCavas/include/diagramCavas.h @@ -74,6 +74,7 @@ public slots: void runPage(const QString); //运行时 void onSignal_runPage(); void onSignal_deletePage(); + void onSignal_extendClick(bool); void onSignal_activatePage(const QString& name); void onSignal_panelDelete(const QString& name,int nType); //type:0editorPanel,1drawPanel diff --git a/diagramCavas/include/diagramCavas_p.h b/diagramCavas/include/diagramCavas_p.h index d721cf2..58ae7ec 100644 --- a/diagramCavas/include/diagramCavas_p.h +++ b/diagramCavas/include/diagramCavas_p.h @@ -50,6 +50,7 @@ public: QMap m_pluginInfo; QMdiArea* m_mdiArea = nullptr; int _curMode = 0; //0编辑1运行 + int _operateMode = 0; //操作模式 0正常1扩展 // 私有方法 void initialImpl(); @@ -69,6 +70,7 @@ public: void deletePanel(const QString& name,int nType); void setCurMode(int); int getCurMode() const {return _curMode;} + int getOperateMode() const {return _operateMode;} //显示属性相关 void showPropertyDlgImpl(); // 显示属性页 diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index e3b90aa..8a9014f 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -139,6 +139,8 @@ public: void updateHMICustomRef(QUuid hmiId,QString model,QUuid itemId,QByteArray hash256); //更新customImg引用 void updateItemPropertyVisibleLst(); //更新对象的属性可见性列表(属性栏使用) QMap> getProVisibleRef(){return _mapSelectedRefs;} + + QMap> calculateUnlinkItem(GraphicsFunctionModelItem*); //计算存在连接但未绘制的item<端口id(无表示母线端口),lst<关联对象id>> /************************数据显示*************************/ void setCurItemPropertyDlg(ItemPropertyDlg* p) {m_curPropertyDlg = p;} ItemPropertyDlg* getCurItemPropertyDlg() {return m_curPropertyDlg;} diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.h index 71f3af9..1893c0b 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.h @@ -12,6 +12,9 @@ public: virtual ~ElectricFunctionModelSvgItemCT(); virtual ElectricFunctionModelSvgItemCT* clone() const override; void setItemType(int n){_itemType = n;} + + virtual void onHoverEnter(QGraphicsSceneHoverEvent* event) override; + virtual void onHoverLeave(QGraphicsSceneHoverEvent* event) override; private: void initial(); protected: diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.h index 014a43c..0cc6bc2 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.h @@ -12,6 +12,9 @@ public: virtual ~ElectricFunctionModelSvgItemPT(); virtual ElectricFunctionModelSvgItemPT* clone() const override; void setItemType(int n){_itemType = n;} + + virtual void onHoverEnter(QGraphicsSceneHoverEvent* event) override; + virtual void onHoverLeave(QGraphicsSceneHoverEvent* event) override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; private: diff --git a/diagramCavas/include/graphicsItem/functionModelItem/graphicsFunctionModelItem.h b/diagramCavas/include/graphicsItem/functionModelItem/graphicsFunctionModelItem.h index 3e0d49e..8d31a92 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/graphicsFunctionModelItem.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/graphicsFunctionModelItem.h @@ -33,10 +33,16 @@ public: QSharedPointer eventContext() const { return m_eventContext; } + + virtual void onHoverEnter(QGraphicsSceneHoverEvent* event); + virtual void onHoverLeave(QGraphicsSceneHoverEvent* event); protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; void executeEvent(const EventData& event); + void hoverEnterEvent(QGraphicsSceneHoverEvent* event) override; + void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) override; protected: + bool m_isHovered = false; BaseItemPropertyProxy* _pPropertyProxy; //属性页代理 QVector m_events; //HMI组态的事件 QSharedPointer m_eventContext; diff --git a/diagramCavas/include/graphicsItem/itemExtend.h b/diagramCavas/include/graphicsItem/itemExtend.h new file mode 100644 index 0000000..2a8a8dc --- /dev/null +++ b/diagramCavas/include/graphicsItem/itemExtend.h @@ -0,0 +1,30 @@ +#ifndef ITEMEXTEND_H +#define ITEMEXTEND_H + +/**********手动扩展结构标志***********/ + +#include "graphicsItem/handleRect.h" + +class ElectricFunctionModelConnectLineItem; + +class ItemExtend : public HandleRect +{ + Q_OBJECT +public: + ItemExtend(QGraphicsItem *parent); + virtual ~ItemExtend(); +public: + void setSourcePortId(const QString& id) {_sourcePortId = id;} + QString getSourcePortId() {return _sourcePortId;} +protected: + virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; +private: + QString _uuid; + QString _sourcePortId; //被哪个port生成 + int m_penWidth; + QColor m_normalColor; + QColor m_hoverColor; + QColor m_currentColor; +}; + +#endif diff --git a/diagramCavas/include/util/baseSelector.h b/diagramCavas/include/util/baseSelector.h index 6974c09..5c8dd03 100644 --- a/diagramCavas/include/util/baseSelector.h +++ b/diagramCavas/include/util/baseSelector.h @@ -38,9 +38,7 @@ enum OperationMode OM_linkMove, //连接线移动 }; -class GraphicsProjectModelItem; - -using ItemMap = QMap>; +class GraphicsFunctionModelItem; class BaseSelector : public QObject { @@ -59,6 +57,8 @@ public: virtual void dragMoveEvent(QGraphicsSceneDragDropEvent *event, DesignerScene*,DiagramMode); virtual void dropEvent(QGraphicsSceneDragDropEvent *event, DesignerScene*,DiagramMode); virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event,DesignerScene*,DiagramMode); + virtual void hoverEnterEvent(QGraphicsSceneHoverEvent* event,DesignerScene*,QGraphicsItem*,DiagramMode); + virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent* event,DesignerScene*,QGraphicsItem*,DiagramMode); SelectorType getSelectorType() { return m_type; } //void setOperationMode(OperationMode m) { m_opMode = m; } diff --git a/diagramCavas/include/util/subMovingSelector.h b/diagramCavas/include/util/subMovingSelector.h index f87e179..45ef4b2 100644 --- a/diagramCavas/include/util/subMovingSelector.h +++ b/diagramCavas/include/util/subMovingSelector.h @@ -22,7 +22,7 @@ public: void mouseMoveEvent(QGraphicsSceneMouseEvent*, DesignerScene*,DiagramMode sceneMode); void mouseReleaseEvent(QGraphicsSceneMouseEvent*, DesignerScene*,DiagramMode sceneMode); private: - GraphicsProjectModelItem* m_pParentItem; + GraphicsFunctionModelItem* m_pParentItem; }; #endif diff --git a/diagramCavas/source/designerScene.cpp b/diagramCavas/source/designerScene.cpp index 040f261..35ee97b 100644 --- a/diagramCavas/source/designerScene.cpp +++ b/diagramCavas/source/designerScene.cpp @@ -88,6 +88,7 @@ void DesignerScene::mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent) DiagramMode mode = m_pDrawingPanel->getMode(); m_pDrawingPanel->selectorManager()->getWorkingSelector()->mouseMoveEvent(mouseEvent, this,mode); update(); + QGraphicsScene::mouseMoveEvent(mouseEvent); } else QGraphicsScene::mouseMoveEvent(mouseEvent); diff --git a/diagramCavas/source/diagramCavas.cpp b/diagramCavas/source/diagramCavas.cpp index 0861cd4..73210ee 100644 --- a/diagramCavas/source/diagramCavas.cpp +++ b/diagramCavas/source/diagramCavas.cpp @@ -162,6 +162,12 @@ void DiagramCavas::onSignal_deletePage() } +void DiagramCavas::onSignal_extendClick(bool bCheck) +{ + Q_D(DiagramCavas); + d->_operateMode = bCheck?1:0; +} + void DiagramCavas::onSignal_activatePage(const QString& name) { Q_D(DiagramCavas); diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index d486f4a..dfb649b 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -2751,6 +2751,7 @@ void FixedPortsModel::previewHMI(SelectPanel* pPanel,QList lst) BaseProperty* pPro = dynamic_cast(pItem->getProperty()); if(pPro){ auto pNewItem = pItem->clone(); + pNewItem->setHandle(pPanel->getModelController()); if(pPro->type() == 8){ auto pLine = dynamic_cast(pNewItem); if(pLine) @@ -2948,3 +2949,57 @@ void FixedPortsModel::updateItemPropertyVisibleLst() ++it; } } + +QMap> FixedPortsModel::calculateUnlinkItem(GraphicsFunctionModelItem* pItem) +{ + QMap> result; + + if (pItem->getItemType() != GIT_link) //获取非电缆对象 + { + QUuid nId = pItem->itemId(); + auto lstConnect = TopologyManager::instance().getConnectionsFor(nId.toString()); + + for (auto &pConnect : lstConnect) + { + if (!pConnect) continue; + + QString fromTerminalId = pConnect->fromTerminalId(); + QString toTerminalId = pConnect->toTerminalId(); + QString fromComponent = pConnect->fromComponent(); + QString toComponent = pConnect->toComponent(); + + QPointF fromPos = getTerminalPos(fromTerminalId); + QPointF toPos = getTerminalPos(toTerminalId); + + // 检查连接是否完整 + QUuid fromTerminalUuid = QUuid(fromTerminalId); + QUuid toTerminalUuid = QUuid(toTerminalId); + QUuid fromItemId = QUuid(fromComponent); + QUuid toItemId = QUuid(toComponent); + + // 检查from端位置是否为(0,0) - 视为未完整连接 + if (fromPos == QPointF(0, 0)) + { + // 记录from端terminal对应的对端itemId + if (!result.contains(fromTerminalUuid)) + { + result[fromTerminalUuid] = QList(); + } + result[fromTerminalUuid].append(toItemId); + } + + // 检查to端位置是否为(0,0) - 视为未完整连接 + if (toPos == QPointF(0, 0)) + { + // 记录to端terminal对应的对端itemId + if (!result.contains(toTerminalUuid)) + { + result[toTerminalUuid] = QList(); + } + result[toTerminalUuid].append(fromItemId); + } + } + } + + return result; +} diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupCT.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupCT.cpp index 878fd1d..b7eb15e 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupCT.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupCT.cpp @@ -111,6 +111,7 @@ void ElectricFunctionModelSvgGroupCT::updateItem() if(_nType == 1){ for(int i = 0;i < _nSize;++i){ ElectricFunctionModelSvgItemCT* p = new ElectricFunctionModelSvgItemCT(rec); + p->setHandle(_pHandle); p->setItemType(_nType); p->setMoveable(false); p->loadSvg(m_mapSvg["ct"]); @@ -119,6 +120,7 @@ void ElectricFunctionModelSvgGroupCT::updateItem() } else if(_nType == 0){ ElectricFunctionModelSvgItemCT* p = new ElectricFunctionModelSvgItemCT(rec); + p->setHandle(_pHandle); p->setItemType(_nType); p->setMoveable(false); p->loadSvg(m_mapSvg["zsct"]); diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.cpp index 06a6275..29812cc 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.cpp @@ -115,6 +115,7 @@ void ElectricFunctionModelSvgGroupPT::updateItem() p->loadSvg(m_mapSvg["z"]); p->setItemType(0); } + p->setHandle(_pHandle); p->setMoveable(false); addSvgItem(p); } diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.cpp index ba87dcf..e4b98c9 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.cpp @@ -1,4 +1,6 @@ #include "graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.h" +#include "baseDrawingPanel.h" +#include "util/selectorManager.h" #include #include @@ -125,4 +127,25 @@ void ElectricFunctionModelSvgItemCT::paint(QPainter* painter, const QStyleOption } } +void ElectricFunctionModelSvgItemCT::onHoverEnter(QGraphicsSceneHoverEvent* event) { + // 基类的基本处理 + if(!_pHandle) + return; + auto mode = _pHandle->getParent()->getMode(); + if(mode != DM_run) + return; + m_isHovered = true; + setOpacity(0.6); + _pHandle->getParent()->selectorManager()->getWorkingSelector()->hoverEnterEvent(event,_pHandle->getScene(),parentItem(),mode); +} +void ElectricFunctionModelSvgItemCT::onHoverLeave(QGraphicsSceneHoverEvent* event) { + if(!_pHandle) + return; + auto mode = _pHandle->getParent()->getMode(); + if(mode != DM_run) + return; + m_isHovered = false; + setOpacity(1.0); + _pHandle->getParent()->selectorManager()->getWorkingSelector()->hoverLeaveEvent(event,_pHandle->getScene(),parentItem(),mode); +} diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.cpp index b8d4a03..98501f9 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.cpp @@ -1,4 +1,6 @@ #include "graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.h" +#include "baseDrawingPanel.h" +#include "util/selectorManager.h" #include #include @@ -81,6 +83,30 @@ void ElectricFunctionModelSvgItemPT::paint(QPainter* painter, const QStyleOption } } +void ElectricFunctionModelSvgItemPT::onHoverEnter(QGraphicsSceneHoverEvent* event) { + // 基类的基本处理 + if(!_pHandle) + return; + auto mode = _pHandle->getParent()->getMode(); + if(mode != DM_run) + return; + m_isHovered = true; + setOpacity(0.6); + _pHandle->getParent()->selectorManager()->getWorkingSelector()->hoverEnterEvent(event,_pHandle->getScene(),parentItem(),mode); +} + +void ElectricFunctionModelSvgItemPT::onHoverLeave(QGraphicsSceneHoverEvent* event) { + if(!_pHandle) + return; + auto mode = _pHandle->getParent()->getMode(); + if(mode != DM_run) + return; + m_isHovered = false; + setOpacity(1.0); + _pHandle->getParent()->selectorManager()->getWorkingSelector()->hoverLeaveEvent(event,_pHandle->getScene(),parentItem(),mode); +} + + void ElectricFunctionModelSvgItemPT::initial() { setFlag(QGraphicsItem::ItemIsSelectable, false); diff --git a/diagramCavas/source/graphicsItem/functionModelItem/graphicsFunctionModelItem.cpp b/diagramCavas/source/graphicsItem/functionModelItem/graphicsFunctionModelItem.cpp index b1d92f0..8884b40 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/graphicsFunctionModelItem.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/graphicsFunctionModelItem.cpp @@ -4,6 +4,8 @@ #include "baseItemPropertyProxy.h" #include "graphicsItem/functionModelItem/graphicsEventContext.h" #include "evetConfig/eventExecutor.h" +#include "baseDrawingPanel.h" +#include "util/selectorManager.h" GraphicsFunctionModelItem::GraphicsFunctionModelItem(QGraphicsItem *parent) : GraphicsProjectModelItem(parent) @@ -11,6 +13,7 @@ GraphicsFunctionModelItem::GraphicsFunctionModelItem(QGraphicsItem *parent) { m_eventContext = QSharedPointer::create(); m_eventExecutor = QSharedPointer(new EventExecutor()); + setAcceptHoverEvents(true); } GraphicsFunctionModelItem::GraphicsFunctionModelItem(const GraphicsFunctionModelItem& obj) @@ -18,6 +21,7 @@ GraphicsFunctionModelItem::GraphicsFunctionModelItem(const GraphicsFunctionModel ,_pPropertyProxy(nullptr) { //只做基本拷贝,用在预览显示 + setAcceptHoverEvents(true); } GraphicsFunctionModelItem::~GraphicsFunctionModelItem() @@ -77,6 +81,25 @@ void GraphicsFunctionModelItem::triggerEvents(const QString& triggerType) } } +void GraphicsFunctionModelItem::onHoverEnter(QGraphicsSceneHoverEvent* event) { + // 基类的基本处理 + auto mode = _pHandle->getParent()->getMode(); + if(mode != DM_run) + return; + m_isHovered = true; + setOpacity(0.6); + _pHandle->getParent()->selectorManager()->getWorkingSelector()->hoverEnterEvent(event,_pHandle->getScene(),this,mode); +} + +void GraphicsFunctionModelItem::onHoverLeave(QGraphicsSceneHoverEvent* event) { + auto mode = _pHandle->getParent()->getMode(); + if(mode != DM_run) + return; + m_isHovered = false; + setOpacity(1.0); + _pHandle->getParent()->selectorManager()->getWorkingSelector()->hoverLeaveEvent(event,_pHandle->getScene(),this,mode); +} + void GraphicsFunctionModelItem::executeEvent(const EventData& event) { m_eventExecutor->execute(event, this); } @@ -87,6 +110,18 @@ void GraphicsFunctionModelItem::paint(QPainter* painter, const QStyleOptionGraph Q_UNUSED(widget) } +void GraphicsFunctionModelItem::hoverEnterEvent(QGraphicsSceneHoverEvent* event) +{ + onHoverEnter(event); + QGraphicsItem::hoverEnterEvent(event); +} + +void GraphicsFunctionModelItem::hoverLeaveEvent(QGraphicsSceneHoverEvent* event) +{ + onHoverLeave(event); + QGraphicsItem::hoverLeaveEvent(event); +} + /********************************功能模item组*************************************/ GraphicsFunctionModelGroup::GraphicsFunctionModelGroup(QGraphicsItem *parent) diff --git a/diagramCavas/source/graphicsItem/itemExtend.cpp b/diagramCavas/source/graphicsItem/itemExtend.cpp new file mode 100644 index 0000000..8a83996 --- /dev/null +++ b/diagramCavas/source/graphicsItem/itemExtend.cpp @@ -0,0 +1,50 @@ +#include +#include "graphicsItem/itemExtend.h" + +ItemExtend::ItemExtend(QGraphicsItem *parent) + : HandleRect(parent) +{ + setAcceptHoverEvents(true); + setFlag(QGraphicsItem::ItemIsSelectable, true); + setFlag(QGraphicsItem::ItemIsFocusable, true); + m_penWidth = 2; + m_normalColor = QColor(52, 152, 219); // 蓝色 + m_hoverColor = QColor(41, 128, 185); // 深蓝 + m_currentColor = m_normalColor; +} + +ItemExtend::~ItemExtend() +{ +} + +void ItemExtend::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) +{ + painter->save(); + painter->setRenderHint(QPainter::Antialiasing, true); + + // 绘制圆形背景 + QBrush bgBrush(m_currentColor); + painter->setBrush(bgBrush); + painter->setPen(Qt::NoPen); + painter->drawEllipse(boundingRect()); + + // 绘制白色"+"号 + QPen pen(Qt::white, m_penWidth); + pen.setCapStyle(Qt::RoundCap); + pen.setJoinStyle(Qt::MiterJoin); + painter->setPen(pen); + + QRectF rect = boundingRect().adjusted(4, 4, -4, -4); + qreal centerX = rect.center().x(); + qreal centerY = rect.center().y(); + qreal lineLength = rect.width() * 0.4; + + // 横线 + painter->drawLine(QLineF(centerX - lineLength/2, centerY, + centerX + lineLength/2, centerY)); + // 竖线 + painter->drawLine(QLineF(centerX, centerY - lineLength/2, + centerX, centerY + lineLength/2)); + + painter->restore(); +} diff --git a/diagramCavas/source/util/baseSelector.cpp b/diagramCavas/source/util/baseSelector.cpp index bd75119..d6b01e8 100644 --- a/diagramCavas/source/util/baseSelector.cpp +++ b/diagramCavas/source/util/baseSelector.cpp @@ -5,6 +5,7 @@ #include #include #include "graphicsItem/graphicsBaseItem.h" +#include "graphicsItem/functionModelItem/graphicsFunctionModelItem.h" #include "topologyManager.h" #include "graphicsItem/itemPort.h" #include "graphicsItem/functionModelItem/electricFunctionModelConnectLineItem.h" @@ -488,6 +489,10 @@ void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene { int a = 1; } + else if(sceneMode == DM_run) + { + int a = 1; + } } void BaseSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene,DiagramMode sceneMode) @@ -702,6 +707,23 @@ void BaseSelector::contextMenuEvent(QGraphicsSceneContextMenuEvent *event,Design } } +void BaseSelector::hoverEnterEvent(QGraphicsSceneHoverEvent* event,DesignerScene* scene,QGraphicsItem* p,DiagramMode sceneMode) +{ + auto pItem = dynamic_cast(p); + if(pItem){ + auto mapLst = _model->calculateUnlinkItem(pItem); + int a = 1; + } +} + +void BaseSelector::hoverLeaveEvent(QGraphicsSceneHoverEvent* event,DesignerScene* scene,QGraphicsItem* p,DiagramMode sceneMode) +{ + auto pItem = dynamic_cast(p); + if(pItem){ + + } +} + void BaseSelector::setCursor(DesignerScene *scene, const QCursor &cursor) { QGraphicsView *view = scene->getView(); diff --git a/diagramCavas/source/util/subMovingSelector.cpp b/diagramCavas/source/util/subMovingSelector.cpp index b6a255c..fc6eb6e 100644 --- a/diagramCavas/source/util/subMovingSelector.cpp +++ b/diagramCavas/source/util/subMovingSelector.cpp @@ -3,6 +3,7 @@ #include #include "graphicsItem/graphicsBaseItem.h" #include "graphicsItem/handleText.h" +#include "graphicsItem/functionModelItem/graphicsFunctionModelItem.h" SubMovingSelector::SubMovingSelector(FixedPortsModel* model,QObject *parent) : BaseSelector(model,parent) @@ -33,7 +34,7 @@ void SubMovingSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, Designer ItemControlHandle* pHandle = qgraphicsitem_cast(items.first()); if(pHandle) { - GraphicsProjectModelItem* item = dynamic_cast(pHandle->getParentPtr()); + GraphicsFunctionModelItem* item = dynamic_cast(pHandle->getParentPtr()); if(item) { if(ms_nDragHandle >= H_textCaption && ms_nDragHandle < H_connect) //移动文本 diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index eed9923..d7e0587 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -212,6 +212,7 @@ void CMainWindow::initializeAction() connect(ui->actionNew,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onSignal_addPage); connect(ui->actionSave,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onSignal_savePage); connect(ui->actionDelete,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onSignal_deletePage); + connect(ui->actionExtend,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onSignal_extendClick); QAction* actNewEditor = ui->menuFile->addAction(QString::fromWCharArray(L"新建组态")); diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index a9f0a91..e3a2ec3 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -120,6 +120,7 @@ QMenu#menubar { + @@ -324,6 +325,23 @@ QMenu#menubar { 运行 + + + true + + + + + + 智能扩展 + + + 智能扩展 + + + QAction::MenuRole::NoRole + +