#pragma once #include "Common.h" #include "CommonDraw.h" /// /// 功能块图形的基类 /// class WindowAppItemInterface; class POU; class WindowAppBlockBase : public QGraphicsObject { Q_OBJECT // 添加这一行,否则会出现警告:Warning: qobject_cast to QGraphicsItem will not work! Q_INTERFACES(QGraphicsItem) public: WindowAppBlockBase( TOOL* pTool, POU* Pou, bool bShowOnly, QGraphicsObject* parent ); // 本Block对应的Interface(绘图用) QVector m_itemInterfaces; // 添加接口(纯虚函数) virtual void addItemInterfaces() = 0; // 2022-6-22 查找某个InferfaceItem是否在本Block内 bool isInBlock(WindowAppItemInterface* infItem); QRectF boundingRect() const override; // 是否可以被删除(引用计数=0,且没有被Task使用) bool couldBeDeleted(); protected: void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override; // 显示右键菜单 void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override; // 功能块有变动时 QVariant itemChange(GraphicsItemChange change, const QVariant& value) override; // 鼠标左键按下 void mousePressEvent(QGraphicsSceneMouseEvent* event); // 鼠标左键抬起 void mouseReleaseEvent(QGraphicsSceneMouseEvent* event); signals: // 功能块位置改变 void blockMoveSignal(QGraphicsItem* item); protected: // 绘制功能块 void DrawBlock(QPainter* painter); // 绘制功能块阴影 void DrawBlockShadow(QPainter* painter); // 更新ItemInterface的位置 void updateInterfacesPostion(); //// 更新单个Interface的位置 //void updateInterfacePostion(WindowAppItemInterface* pInfItem); // 重绘所有的Interface void redrawAllInterface(); // 初始化功能块的右键菜单 void createContextMenu(); // 返回本功能块的引用计数(所有接口引用计数之和) int getRefCount(); // 2021-8-17 检查功能块位置(碰撞检测,限制移动范围) QVariant checkPosition(const QVariant& value); // 2021-8-17 处理碰撞判断 bool checkCollision(); // 2021-8-17 限制功能块在场景内 bool restrictBlockPos(QPointF curPos); // 2022-10-4,删除当前功能块(统一功能块的删除入口) void onDeleteItem(); public: // 对应的工具数据信息 TOOL* m_toolInfo; protected: // 主体矩形区域 QRectF blockRect; // 功能块的序号矩形区域 QRectF blockIndexRect; // 边界矩形区域(未计算接口长度) QRectF blockBoundingRect; //// 总矩形区域(算上接口长度) //QRectF blockTotalRect; // 本工具所属的Pou POU* m_pPou; // 是否仅供展示使用(不提供右键菜单以及其他互动功能) bool m_bShowOnly; // 经过调整之后的功能块的位置(经过碰撞检测、边界检测后) QPointF m_fixPos; // 2022-10-2增加,功能块移动前的位置(用于执行Undo) QPointF m_oldPos; protected: // 功能块的右键菜单 QMenu* contextMenu; // 右键菜单对应的action QAction* executeAction; QAction* executeSubAction; QAction* executeAllAction; QAction* executeBreakPoint; QAction* moveUpAction; QAction* moveDownAction; QAction* moveFirstAction; QAction* moveLastAction; QAction* deleteAction; QAction* propertyAction; QAction* copyBlockAction; QAction* copyDataAction; QAction* pasteAction; };