#pragma once
#include "Common.h"
#include "CommonDraw.h"
///
/// 用于显示功能块等高线和等宽线的信息参数结构体
///
typedef struct _tagUiIsoLineInfo
{
// 需要绘制等宽线的控件信息
QWidget* pWidget;
// 等宽线的绘制方向
SIDE_DIRECTION sideDir;
// 当前拖拽方向(仅确定源控件的等宽线位置时需要用到)
STRETCH_DIRECTION stretchDir;
// 默认构造函数
_tagUiIsoLineInfo()
{
pWidget = nullptr;
sideDir = SIDE_DIRECTION::SIDE_NONE;
stretchDir = STRETCH_DIRECTION::DIR_NONE;
}
// 带参数构造函数
_tagUiIsoLineInfo(
QWidget* widget,
SIDE_DIRECTION side,
STRETCH_DIRECTION sDir = STRETCH_DIRECTION::DIR_NONE
)
{
this->pWidget = widget;
this->sideDir = side;
this->stretchDir = sDir;
}
} UI_ISOLINE_INFO;
///
/// UI等高线类,用于绘制和现实UI界面中控件尺寸对齐时显示的等高线和等宽线
///
class WindowAppItemIsometricLine : public QObject, public QGraphicsLineItem
{
Q_OBJECT
public:
WindowAppItemIsometricLine(const UI_ISOLINE_INFO& lineInfo);
// 设定本Item的自定义类型
enum { Type = ITEM_TYPE_ISO_LINE };
int type() const
{
// 针对该 item 启用 qgraphicsitem_cast
return Type;
}
public:
// 本等宽线的具体参数信息
UI_ISOLINE_INFO m_isoLineInfo;
protected slots:
// 绘制线条
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override;
protected:
// 绘制等宽线
void drawIsoLines(QPainter* painter);
// 在指定的边旁边绘制等宽线
void drawIsoLines(QPainter* painter, const QLine& side, SIDE_DIRECTION sideDir);
// 绘制箭头线条
void drawIsoArrowLines(QPainter* painter, QLine line1, QLine line2, SIDE_DIRECTION sideDir);
// 为指定的线条绘制箭头
void drawIsoArrow(QPainter* painter, QLineF isoLine);
};