#include "WindowAppItemRefLine.h" #include "../Common/Utility.h" /// /// 按照对应的参考线信息生成LineItem /// /// WindowAppItemRefLine::WindowAppItemRefLine(const UI_REFLINE_INFO& lineInfo): m_refLineInfo(lineInfo) { } /// /// 绘制线条 /// /// /// /// 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(); } /// /// 根据最新的控件位置信息,计算当前参考线中的起点和终点信息(方向为从上到下,从左到右) /// /// /// 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); } }