123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #include "WindowAppItemRefLine.h"
- #include "../Common/Utility.h"
- /// <summary>
- /// 按照对应的参考线信息生成LineItem
- /// </summary>
- /// <param name="lineInfo"></param>
- WindowAppItemRefLine::WindowAppItemRefLine(const UI_REFLINE_INFO& lineInfo):
- m_refLineInfo(lineInfo)
- {
- }
- /// <summary>
- /// 绘制线条
- /// </summary>
- /// <param name="painter"></param>
- /// <param name="option"></param>
- /// <param name="widget"></param>
- void WindowAppItemRefLine::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget /*= nullptr*/)
- {
- Q_UNUSED(option);
- Q_UNUSED(widget);
- // 计算最新的起点和终点
- QPoint startPt, endPt;
- this->calcLineVertex(m_refLineInfo.srcWidget, m_refLineInfo.dstWidget, startPt, endPt);
- // 设置连接线条
- this->setLine(QLine(startPt, endPt));
- // qDebug() << "WindowAppUiRefLine::paint - DrawRefLine - " << QLine(startPt, endPt);
- painter->setRenderHint(QPainter::Antialiasing, true);
- painter->save();
- // 虚线
- painter->setPen(QPen(COLOR_REFLINE, PEN_LINE_WIDTH, Qt::DashLine));
- // 绘制线条
- painter->drawLine(line());
- painter->restore();
- }
- /// <summary>
- /// 根据最新的控件位置信息,计算当前参考线中的起点和终点信息(方向为从上到下,从左到右)
- /// </summary>
- /// <param name="startPoint"></param>
- /// <param name="endPoint"></param>
- void WindowAppItemRefLine::calcLineVertex(
- QWidget* srcWidget,
- QWidget* dstWidget,
- _Out_ QPoint& startPoint,
- _Out_ QPoint& endPoint
- )
- {
- // 竖线
- if (m_refLineInfo.srcSide == SIDE_DIRECTION::SIDE_LEFT
- || m_refLineInfo.srcSide == SIDE_DIRECTION::SIDE_RIGHT)
- {
- QLine srcLine = Utility::getSideLineByID(srcWidget, (short)m_refLineInfo.srcSide);
- QLine dstLine = Utility::getSideLineByID(dstWidget, (short)m_refLineInfo.dstSide);
-
- // 取Y值最小的点作为起点(从上到下)
- // 起点边位于终点边下侧或者重合
- if (srcLine.p2().y() >= dstLine.p1().y())
- {
- startPoint = dstLine.p1();
- endPoint = srcLine.p2();
- }
- // 起点边位于终点边上侧
- else
- {
- startPoint = srcLine.p1();
- endPoint = dstLine.p2();
- }
- // 上下都需要额外加上延长线
- startPoint.setY(startPoint.y() - REFLINE_EXTENSION_LEN);
- endPoint.setY(endPoint.y() + REFLINE_EXTENSION_LEN);
- }
- // 横线
- else
- {
- QLine srcLine = Utility::getSideLineByID(srcWidget, (short)m_refLineInfo.srcSide);
- QLine dstLine = Utility::getSideLineByID(dstWidget, (short)m_refLineInfo.dstSide);
- // 取X值最小的点作为起点(从左到右)
- // 起点边位于终点边右侧或者重合
- if (srcLine.p2().x() >= dstLine.p1().x())
- {
- startPoint = dstLine.p1();
- endPoint = srcLine.p2();
- }
- // 起点边位于终点边左侧
- else
- {
- startPoint = srcLine.p1();
- endPoint = dstLine.p2();
- }
- // 上下都需要额外加上延长线
- startPoint.setX(startPoint.x() - REFLINE_EXTENSION_LEN);
- endPoint.setX(endPoint.x() + REFLINE_EXTENSION_LEN);
- }
- }
|