WindowAppBlockBase.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #pragma once
  2. #include "Common.h"
  3. #include "CommonDraw.h"
  4. /// <summary>
  5. /// 功能块图形的基类
  6. /// </summary>
  7. class WindowAppItemInterface;
  8. class POU;
  9. class WindowAppBlockBase : public QGraphicsObject
  10. {
  11. Q_OBJECT
  12. // 添加这一行,否则会出现警告:Warning: qobject_cast to QGraphicsItem will not work!
  13. Q_INTERFACES(QGraphicsItem)
  14. public:
  15. WindowAppBlockBase(
  16. TOOL* pTool,
  17. POU* Pou,
  18. bool bShowOnly,
  19. QGraphicsObject* parent
  20. );
  21. // 本Block对应的Interface(绘图用)
  22. QVector<WindowAppItemInterface*> m_itemInterfaces;
  23. // 添加接口(纯虚函数)
  24. virtual void addItemInterfaces() = 0;
  25. // 2022-6-22 查找某个InferfaceItem是否在本Block内
  26. bool isInBlock(WindowAppItemInterface* infItem);
  27. QRectF boundingRect() const override;
  28. // 是否可以被删除(引用计数=0,且没有被Task使用)
  29. bool couldBeDeleted();
  30. protected:
  31. void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override;
  32. // 显示右键菜单
  33. void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override;
  34. // 功能块有变动时
  35. QVariant itemChange(GraphicsItemChange change, const QVariant& value) override;
  36. // 鼠标左键按下
  37. void mousePressEvent(QGraphicsSceneMouseEvent* event);
  38. // 鼠标左键抬起
  39. void mouseReleaseEvent(QGraphicsSceneMouseEvent* event);
  40. signals:
  41. // 功能块位置改变
  42. void blockMoveSignal(QGraphicsItem* item);
  43. protected:
  44. // 绘制功能块
  45. void DrawBlock(QPainter* painter);
  46. // 绘制功能块阴影
  47. void DrawBlockShadow(QPainter* painter);
  48. // 更新ItemInterface的位置
  49. void updateInterfacesPostion();
  50. //// 更新单个Interface的位置
  51. //void updateInterfacePostion(WindowAppItemInterface* pInfItem);
  52. // 重绘所有的Interface
  53. void redrawAllInterface();
  54. // 初始化功能块的右键菜单
  55. void createContextMenu();
  56. // 返回本功能块的引用计数(所有接口引用计数之和)
  57. int getRefCount();
  58. // 2021-8-17 检查功能块位置(碰撞检测,限制移动范围)
  59. QVariant checkPosition(const QVariant& value);
  60. // 2021-8-17 处理碰撞判断
  61. bool checkCollision();
  62. // 2021-8-17 限制功能块在场景内
  63. bool restrictBlockPos(QPointF curPos);
  64. // 2022-10-4,删除当前功能块(统一功能块的删除入口)
  65. void onDeleteItem();
  66. public:
  67. // 对应的工具数据信息
  68. TOOL* m_toolInfo;
  69. protected:
  70. // 主体矩形区域
  71. QRectF blockRect;
  72. // 功能块的序号矩形区域
  73. QRectF blockIndexRect;
  74. // 边界矩形区域(未计算接口长度)
  75. QRectF blockBoundingRect;
  76. //// 总矩形区域(算上接口长度)
  77. //QRectF blockTotalRect;
  78. // 本工具所属的Pou
  79. POU* m_pPou;
  80. // 是否仅供展示使用(不提供右键菜单以及其他互动功能)
  81. bool m_bShowOnly;
  82. // 经过调整之后的功能块的位置(经过碰撞检测、边界检测后)
  83. QPointF m_fixPos;
  84. // 2022-10-2增加,功能块移动前的位置(用于执行Undo)
  85. QPointF m_oldPos;
  86. protected:
  87. // 功能块的右键菜单
  88. QMenu* contextMenu;
  89. // 右键菜单对应的action
  90. QAction* executeAction;
  91. QAction* executeSubAction;
  92. QAction* executeAllAction;
  93. QAction* executeBreakPoint;
  94. QAction* moveUpAction;
  95. QAction* moveDownAction;
  96. QAction* moveFirstAction;
  97. QAction* moveLastAction;
  98. QAction* deleteAction;
  99. QAction* propertyAction;
  100. QAction* copyBlockAction;
  101. QAction* copyDataAction;
  102. QAction* pasteAction;
  103. };