WindowAppItemRefLine.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include "WindowAppItemRefLine.h"
  2. #include "../Common/Utility.h"
  3. /// <summary>
  4. /// 按照对应的参考线信息生成LineItem
  5. /// </summary>
  6. /// <param name="lineInfo"></param>
  7. WindowAppItemRefLine::WindowAppItemRefLine(const UI_REFLINE_INFO& lineInfo):
  8. m_refLineInfo(lineInfo)
  9. {
  10. }
  11. /// <summary>
  12. /// 绘制线条
  13. /// </summary>
  14. /// <param name="painter"></param>
  15. /// <param name="option"></param>
  16. /// <param name="widget"></param>
  17. void WindowAppItemRefLine::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget /*= nullptr*/)
  18. {
  19. Q_UNUSED(option);
  20. Q_UNUSED(widget);
  21. // 计算最新的起点和终点
  22. QPoint startPt, endPt;
  23. this->calcLineVertex(m_refLineInfo.srcWidget, m_refLineInfo.dstWidget, startPt, endPt);
  24. // 设置连接线条
  25. this->setLine(QLine(startPt, endPt));
  26. // qDebug() << "WindowAppUiRefLine::paint - DrawRefLine - " << QLine(startPt, endPt);
  27. painter->setRenderHint(QPainter::Antialiasing, true);
  28. painter->save();
  29. // 虚线
  30. painter->setPen(QPen(COLOR_REFLINE, PEN_LINE_WIDTH, Qt::DashLine));
  31. // 绘制线条
  32. painter->drawLine(line());
  33. painter->restore();
  34. }
  35. /// <summary>
  36. /// 根据最新的控件位置信息,计算当前参考线中的起点和终点信息(方向为从上到下,从左到右)
  37. /// </summary>
  38. /// <param name="startPoint"></param>
  39. /// <param name="endPoint"></param>
  40. void WindowAppItemRefLine::calcLineVertex(
  41. QWidget* srcWidget,
  42. QWidget* dstWidget,
  43. _Out_ QPoint& startPoint,
  44. _Out_ QPoint& endPoint
  45. )
  46. {
  47. // 竖线
  48. if (m_refLineInfo.srcSide == SIDE_DIRECTION::SIDE_LEFT
  49. || m_refLineInfo.srcSide == SIDE_DIRECTION::SIDE_RIGHT)
  50. {
  51. QLine srcLine = Utility::getSideLineByID(srcWidget, (short)m_refLineInfo.srcSide);
  52. QLine dstLine = Utility::getSideLineByID(dstWidget, (short)m_refLineInfo.dstSide);
  53. // 取Y值最小的点作为起点(从上到下)
  54. // 起点边位于终点边下侧或者重合
  55. if (srcLine.p2().y() >= dstLine.p1().y())
  56. {
  57. startPoint = dstLine.p1();
  58. endPoint = srcLine.p2();
  59. }
  60. // 起点边位于终点边上侧
  61. else
  62. {
  63. startPoint = srcLine.p1();
  64. endPoint = dstLine.p2();
  65. }
  66. // 上下都需要额外加上延长线
  67. startPoint.setY(startPoint.y() - REFLINE_EXTENSION_LEN);
  68. endPoint.setY(endPoint.y() + REFLINE_EXTENSION_LEN);
  69. }
  70. // 横线
  71. else
  72. {
  73. QLine srcLine = Utility::getSideLineByID(srcWidget, (short)m_refLineInfo.srcSide);
  74. QLine dstLine = Utility::getSideLineByID(dstWidget, (short)m_refLineInfo.dstSide);
  75. // 取X值最小的点作为起点(从左到右)
  76. // 起点边位于终点边右侧或者重合
  77. if (srcLine.p2().x() >= dstLine.p1().x())
  78. {
  79. startPoint = dstLine.p1();
  80. endPoint = srcLine.p2();
  81. }
  82. // 起点边位于终点边左侧
  83. else
  84. {
  85. startPoint = srcLine.p1();
  86. endPoint = dstLine.p2();
  87. }
  88. // 上下都需要额外加上延长线
  89. startPoint.setX(startPoint.x() - REFLINE_EXTENSION_LEN);
  90. endPoint.setX(endPoint.x() + REFLINE_EXTENSION_LEN);
  91. }
  92. }