WindowAppBlockParallel.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include "WindowAppBlockParallel.h"
  2. #include "WindowAppItemInterface.h"
  3. WindowAppBlockParallel::WindowAppBlockParallel(TOOL* pNewTool, POU* Pou, bool bShowOnly, QGraphicsObject* parent /*= nullptr*/)
  4. : WindowAppBlockStandardBase(pNewTool, Pou, bShowOnly, parent)
  5. , m_ParallelLineItem(nullptr)
  6. {
  7. //// 允许发送尺寸变更通知
  8. //setFlag(QGraphicsItem::ItemSendsGeometryChanges);
  9. // 响应鼠标悬停事件(重要,否则QGraphicsItem默认是不响应鼠标悬停事件的)
  10. this->setAcceptHoverEvents(true);
  11. // 更新矩形区域的尺寸
  12. this->updateRect();
  13. }
  14. WindowAppBlockParallel::~WindowAppBlockParallel()
  15. {
  16. }
  17. /// <summary>
  18. /// 添加接口(Parallel工具需要额外添加ToolInterface接口)
  19. /// </summary>
  20. void WindowAppBlockParallel::addItemInterfaces()
  21. {
  22. // 添加标准接口
  23. WindowAppBlockStandardBase::addItemInterfaces();
  24. // 添加Tool接口
  25. WindowAppBlockStandardBase::addItemToolInterfaces();
  26. // 2022-8-23,首次添加时需要直接更新并行母线的位置,否则ToolEnd接口会按照默认形式显示
  27. this->updateParallelLine();
  28. }
  29. /// <summary>
  30. /// 更新并行母线的位置
  31. /// </summary>
  32. void WindowAppBlockParallel::updateParallelLine()
  33. {
  34. if (m_itemInterfaces.size() > 0)
  35. {
  36. m_itemInterfaces[PARALL_END_INF_INDX]->updatePostion();
  37. }
  38. }
  39. /// <summary>
  40. /// 绘制并行控件
  41. /// </summary>
  42. /// <param name="painter"></param>
  43. /// <param name="option"></param>
  44. /// <param name="widget"></param>
  45. void WindowAppBlockParallel::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
  46. {
  47. // WindowAppBlockStandardBase::paint(painter, option, widget);
  48. Q_UNUSED(option);
  49. Q_UNUSED(widget);
  50. painter->save();
  51. painter->setRenderHint(QPainter::Antialiasing, true);
  52. // 绘制边框
  53. this->drawFrame(painter);
  54. // 绘制功能块名字
  55. WindowAppBlockStandardBase::DrawBlockTitle(painter, true);
  56. // 绘制索引号
  57. WindowAppBlockStandardBase::DrawIndex(painter);
  58. painter->restore();
  59. }
  60. /// <summary>
  61. /// 功能块有变动时
  62. /// </summary>
  63. /// <param name="change"></param>
  64. /// <param name="value"></param>
  65. /// <returns></returns>
  66. QVariant WindowAppBlockParallel::itemChange(GraphicsItemChange change, const QVariant& value)
  67. {
  68. // 首先调用基类的函数
  69. WindowAppBlockBase::itemChange(change, value);
  70. // 移动完毕之后,更新并行母线的位置
  71. if (change == QGraphicsItem::ItemPositionHasChanged && scene())
  72. {
  73. this->updateParallelLine();
  74. }
  75. return QGraphicsItem::itemChange(change, value);
  76. }
  77. /// <summary>
  78. /// 绘制边框
  79. /// </summary>
  80. /// <param name="painter"></param>
  81. void WindowAppBlockParallel::drawFrame(QPainter* painter)
  82. {
  83. // 设置画笔
  84. if (!this->isSelected())
  85. {
  86. painter->setPen(QPen(COLOR_FRAME_PARALLEL, PEN_WIDTH_FRAME));
  87. }
  88. else
  89. {
  90. painter->setPen(QPen(COLOR_FRAME_PARALLEL, PEN_WIDTH_FRAME_BOLD));
  91. }
  92. // 填充
  93. painter->setBrush(COLOR_TBD_BG);
  94. // 绘制边框
  95. painter->drawRoundedRect(blockRect, 0, 0);
  96. }
  97. /// <summary>
  98. /// 更新矩形区域的尺寸
  99. /// </summary>
  100. void WindowAppBlockParallel::updateRect()
  101. {
  102. // 计算高度
  103. int blockHeight = PARA_BASIC_HEIGHT;
  104. // 计算宽度
  105. int blockWidth = PARA_BASIC_WIDTH;
  106. // 主体矩形区域
  107. blockRect.setRect(
  108. -blockWidth / 2,
  109. -blockHeight / 2,
  110. blockWidth,
  111. blockHeight
  112. );
  113. // 序号矩形区域
  114. blockIndexRect.setRect(
  115. blockRect.right() - TBD_INDEX_WIDTH,
  116. blockRect.top() - TBD_INDEX_HEIGHT / 2,
  117. TBD_INDEX_WIDTH,
  118. TBD_INDEX_HEIGHT
  119. );
  120. // 总体矩形边界
  121. blockBoundingRect.setRect(
  122. blockRect.left(),
  123. blockRect.top() - TBD_INDEX_HEIGHT / 2,
  124. blockRect.width() + TBD_SHADOW_COUNT * PEN_LINE_WIDTH,
  125. blockRect.height() + TBD_INDEX_HEIGHT / 2 + TBD_SHADOW_COUNT * PEN_LINE_WIDTH
  126. );
  127. }