DAWorkbench 0.0.1
DAWorkbench API
载入中...
搜索中...
未找到
DAGraphicsLinkItem.h
1#ifndef DAGRAPHICSLINKITEM_H
2#define DAGRAPHICSLINKITEM_H
3#include "DAGraphicsViewGlobal.h"
4#include "DAGraphicsItem.h"
5#include <QGraphicsItem>
6class QDomDocument;
7class QDomElement;
8class QGraphicsSceneMouseEvent;
9namespace DA
10{
11class DAGraphicsScene;
15class DAGRAPHICSVIEW_API DAGraphicsLinkItem : public DAGraphicsItem
16{
17 Q_OBJECT
18 DA_DECLARE_PRIVATE(DAGraphicsLinkItem)
19public:
20 enum AnonymousType
21 {
23 };
24 int type() const override
25 {
26 return (anonymous);
27 }
32 {
35 LinkLineKnuckle
36 };
37
42 {
43 OrientationStart = 0,
45 OrientationBoth
46 };
47
52 {
54 EndPointTriangType
55 };
56
57public:
58 DAGraphicsLinkItem(QGraphicsItem* p = nullptr);
60 // 设置连接点的形式
61 void setEndPointType(Orientations o, EndPointType epType);
62 EndPointType getEndPointType(Orientations o) const;
63 // 端点大小
64 int getEndPointSize() const;
65 void setEndPointSize(int v);
66 // 连线方式
67 void setLinkLineStyle(LinkLineStyle s);
68 LinkLineStyle getLinkLineStyle() const;
69
70 // 设置线的画笔
71 void setLinePen(const QPen& p);
72 QPen getLinePen() const;
73
74 // 【重要虚函数】更新范围参数
75 virtual QRectF updateBoundingRect();
76
77 // 设置贝塞尔曲线的控制点的缩放比例,连线时按照控制点的方向延伸出贝塞尔曲线的控制点,延伸的控制点的长度w = length * bezierControlScale
78 void setBezierControlScale(qreal rate = 0.25);
79 qreal getBezierControlScale() const;
80
81 // 开始连接点的位置,位置基于scene
82 virtual void setStartScenePosition(const QPointF& scenepostion);
83 QPointF getStartScenePosition() const;
84
85 // 结束连接点的位置
86 virtual void setEndScenePosition(const QPointF& scenepostion);
87 QPointF getEndScenePosition() const;
88 // 获取链接线
89 QPainterPath getLinkLinePainterPath() const;
90 // 获取末端(箭头)的绘图路径
91 QPainterPath getEndPointPainterPath(Orientations epType) const;
92 // 更新末端(箭头)
93 void updateEndPoint();
94 // 绘图
95 virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr) override;
96 // 绘制连接线
97 virtual void paintLinkLine(QPainter* painter,
98 const QStyleOptionGraphicsItem* option,
99 QWidget* widget,
100 const QPainterPath& linkPath);
101 // 绘制箭头
102 virtual void paintEndPoint(QPainter* painter,
103 const QStyleOptionGraphicsItem* option,
104 const QPointF& pStart,
105 EndPointType etStart,
106 const QPainterPath& startPainterPath,
107 const QPointF& pEnd,
108 EndPointType etEnd,
109 const QPainterPath& endPainterPath,
110 const QPainterPath& linkPath);
111
112 virtual QRectF boundingRect() const override;
113 virtual QPainterPath shape() const override;
114
115 // 生成painterpath
116 virtual QPainterPath generateLinePainterPath(const QPointF& fromPoint,
117 const QPointF& toPoint,
118 LinkLineStyle linestyle = LinkLineStraight);
119 // 生成箭头,绘制的时候需要根据情况进行旋转
120 virtual QPainterPath generateEndPointPainterPath(EndPointType epType, int size);
121 // 在将要结束链接的回调,通过此回调可以执行完成链接后的相关操作,例如判断末端链接的图元,从而实现路径调整
122 // 如果此函数返回false,将代表不接受链接,这时候,结束动作会被跳过,也就是鼠标点击是没有无法结束链接而生成连接线
123 virtual bool willCompleteLink();
124 // 保存到xml中
125 virtual bool saveToXml(QDomDocument* doc, QDomElement* parentElement, const QVersionNumber& ver) const override;
126 virtual bool loadFromXml(const QDomElement* parentElement, const QVersionNumber& ver) override;
127 // 设置在场景的位置,如果没有分组,和setPos一样,如果分组了,最终也能保证位置在pos位置
128 void setScenePos(const QPointF& p);
129 void setScenePos(qreal x, qreal y);
130
131public:
132 // 计算两个点的距离
133 static qreal pointLength(const QPointF& a, const QPointF& b);
134
135 // 延长线,以一个方向和距离延伸
136 static QPointF elongation(const QPointF& orgPoint, AspectDirection d, qreal externLen);
137
138 // 判断两个方向是否相对,也就是东对西,南对北就是相对,相对必定平行
139 static bool isDirectionOpposite(AspectDirection d1, AspectDirection d2);
140
141 // 判断两个方向是否平行
142 static bool isDirectionParallel(AspectDirection d1, AspectDirection d2);
143
144 // 顺着点1的方向看,点2是否在前面
145 static bool isPointInFront(const QPointF& p1, AspectDirection d1, const QPointF& p2);
146 // 点是否会相遇
147 static bool isPointCanMeet(const QPointF& p1, AspectDirection d1, const QPointF& p2, AspectDirection d2);
148 // 针对平行点线,沿着方向移动可以接近,此函数只对平行点线有用
149 static bool isParallelPointApproachInDirection(const QPointF& p1, AspectDirection d1, const QPointF& p2, AspectDirection d2);
150 // 翻转方向
151 static AspectDirection oppositeDirection(AspectDirection d);
152 // 返回点1相对点2的方位
153 static AspectDirection relativeDirectionOfPoint(const QPointF& p1, const QPointF& p2);
154 // 获取线段的末端,这个函数可以返回末端但有不是终端的点,这个点离终端的距离不会超过distanceMaxPx
155 static QPointF calcPainterPathEndPoint(const QPainterPath& path,
156 bool fromStart = true,
157 qreal distanceMaxPx = 18.0,
158 int maxTryCnt = 10);
159
160protected:
161 // 获取DAGraphicsScene
162 DAGraphicsScene* daScene() const;
163 // 开始连接点的位置
164 void setStartPosition(const QPointF& p);
165 const QPointF& getStartPosition() const;
166
167 // 结束连接点的位置
168 void setEndPosition(const QPointF& p);
169 const QPointF& getEndPosition() const;
170 // 获取绘图的画笔
171 virtual QPen getPainterPen(const QStyleOptionGraphicsItem* option) const;
172 // 生成painterpath
173 virtual QPainterPath generateLinkLineBezierPainterPath(const QPointF& fromPos,
174 AspectDirection fromDirect,
175 const QPointF& toPos,
176 AspectDirection toDirect);
177 // 生成直线
178 virtual QPainterPath generateLinkLineStraightPainterPath(const QPointF& fromPos, const QPointF& toPos);
179 // 生成直角线
180 virtual QPainterPath generateLinkLineKnucklePainterPath(const QPointF& fromPos,
181 AspectDirection fromDirect,
182 const QPointF& toPos,
183 AspectDirection toDirect);
184};
185
186} // end DA
187
188#endif // DAGRAPHICSLINKITEM_H
DAGraphicsView的基本元件
Definition DAGraphicsItem.h:19
绘制连接线的item
Definition DAGraphicsLinkItem.h:16
EndPointType
端点样式
Definition DAGraphicsLinkItem.h:52
@ EndPointNone
没有箭头
Definition DAGraphicsLinkItem.h:53
Orientations
标记方向
Definition DAGraphicsLinkItem.h:42
@ OrientationEnd
连接的结束点
Definition DAGraphicsLinkItem.h:44
LinkLineStyle
连接点的样式
Definition DAGraphicsLinkItem.h:32
@ LinkLineStraight
直线连接
Definition DAGraphicsLinkItem.h:34
@ LinkLineBezier
贝塞尔曲线连接
Definition DAGraphicsLinkItem.h:33
这是带着undostack的GraphicsScene 此QGraphicsScene支持:
Definition DAGraphicsScene.h:30
序列化类都是带异常的,使用中需要处理异常
Definition AppMainWindow.cpp:44
AspectDirection
方向
Definition DAGraphicsViewGlobal.h:33
@ ItemType_DAGraphicsLinkItem
针对DAGraphicsLinkItem的类型
Definition DAGraphicsViewGlobal.h:90