#pragma once #include "Common.h" #include "CommonDraw.h" /// /// 参考线信息参数结构体 /// typedef struct _tagUiRefLineInfo { // 参考线涉及的源控件和目的控件 QWidget* srcWidget; QWidget* dstWidget; // 参考线涉及的源控件和目的控件的边 SIDE_DIRECTION srcSide; SIDE_DIRECTION dstSide; _tagUiRefLineInfo() { srcWidget = nullptr; dstWidget = nullptr; srcSide = SIDE_DIRECTION::SIDE_NONE; dstSide = SIDE_DIRECTION::SIDE_NONE; } // 按照参数构造RefLine信息 _tagUiRefLineInfo(QWidget* srcWidget, QWidget* dstWidget, SIDE_DIRECTION srcSide, SIDE_DIRECTION dstSide) { this->srcWidget = srcWidget; this->dstWidget = dstWidget; this->srcSide = srcSide; this->dstSide = dstSide; } // 重载 == 做比较 bool operator == (const _tagUiRefLineInfo& lineInfo) { if (this->srcWidget == lineInfo.srcWidget && this->dstWidget == lineInfo.dstWidget && this->srcSide == lineInfo.srcSide && this->dstSide == lineInfo.dstSide ) { return true; } return false; } } UI_REFLINE_INFO; /// /// UI参考线类,用于绘制和显示UI界面中控件移动的参考线 /// class WindowAppItemRefLine : public QObject, public QGraphicsLineItem { Q_OBJECT public: WindowAppItemRefLine(const UI_REFLINE_INFO& lineInfo); // 设定本Item的自定义类型 enum { Type = ITEM_TYPE_REF_LINE }; int type() const { // 针对该 item 启用 qgraphicsitem_cast return Type; } public: // 本参考线的具体参数信息 UI_REFLINE_INFO m_refLineInfo; protected slots: // 绘制线条 void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override; protected: // 根据最新的控件位置信息,计算当前参考线中的起点和终点信息(方向为从上到下,从左到右) void calcLineVertex( QWidget* srcWidget, QWidget* dstWidget, _Out_ QPoint& startPoint, _Out_ QPoint& endPoint ); };