#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
);
};