DAWorkbench 0.0.1
DAWorkbench API
载入中...
搜索中...
未找到
DAGraphicsScene.h
1#ifndef DAGRAPHICSSCENE_H
2#define DAGRAPHICSSCENE_H
3#include "DAGraphicsViewGlobal.h"
4#include <QGraphicsScene>
5#include <QUndoStack>
6#include <QImage>
7#include <QTextDocument>
8namespace DA
9{
10class DAGraphicsResizeableItem;
11class DAGraphicsItem;
12class DAGraphicsTextItem;
13class DAGraphicsRectItem;
14class DAGraphicsLinkItem;
15class DAGraphicsItemGroup;
16class DAAbstractGraphicsSceneAction;
17class DAGraphicsLayout;
18class DAGraphicsCommandsFactory;
29class DAGRAPHICSVIEW_API DAGraphicsScene : public QGraphicsScene
30{
31 Q_OBJECT
32 DA_DECLARE_PRIVATE(DAGraphicsScene)
33 friend class DAGraphicsResizeableItem;
34
35public:
40 {
44 LinkModeAutoStartEndFollowMouseClick
45 };
46
47public:
48 DAGraphicsScene(QObject* p = nullptr);
49 DAGraphicsScene(const QRectF& sceneRect, QObject* p = nullptr);
50 DAGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject* p = nullptr);
52 // 获取当前鼠标在scene的位置
53 QPointF getCurrentMouseScenePos() const;
54 // 获取最后鼠标在scene点击的位置
55 QPointF getLastMousePressScenePos() const;
56 // 获取选中且能移动的item
57 QList< QGraphicsItem* > getSelectedMovableItems();
58 // 等同additem,但使用redo/undo来添加,可以进行redo/undo操作
59 QUndoCommand* addItem_(QGraphicsItem* item);
60 QUndoCommand* addItems_(const QList< QGraphicsItem* >& its);
61 // 等同removeItem,但使用redo/undo来添加,可以进行redo/undo操作
62 QUndoCommand* removeItem_(QGraphicsItem* item);
63 QUndoCommand* removeItems_(const QList< QGraphicsItem* >& its);
64 // 导出为pixmap,dpi=0代表不考虑dpi
65 QPixmap toPixamp(int dpi = 0);
66 // 保存为图片
67 QImage toImage(int dpi = 0);
68 // 链接模式
69 void beginLink(DAGraphicsLinkItem* linkItem, LinkMode lm = LinkModeAutoStartEndFollowMouseClick);
70 // 判断当前是否是链接模式
71 bool isStartLink() const;
72 // 结束链接模式,结束后会发出linkCompleted信号
73 void endLink();
74 // 取消链接模式
75 virtual void cancelLink();
76 // 取消
77 virtual void cancel();
78 // 获取当前正在进行连线的连接线item
79 DAGraphicsLinkItem* getCurrentLinkItem() const;
80 // 设置忽略链接事件的处理,主要忽略mousePressEvent,mouseMoveEvent的链接事件,
81 // 这个函数一般是在子类中的重载函数中调用,用于进行一些特殊处理需要暂时屏蔽掉链接事件
82 void setIgnoreLinkEvent(bool on);
83 bool isIgnoreLinkEvent() const;
84 // 选中的item进行分组,支持redo/undo
85 void groupingSelectItems_();
86 // 移除选中的分组
87 void removeSelectItemGroup_();
88 // 是否允许对齐网格
89 bool isEnableSnapToGrid() const;
90 // 是否显示网格
91 bool isShowGridLine();
92 // 设置网格尺寸
93 void setGridSize(const QSize& gs);
94 QSize getGridSize() const;
95 // 网格画笔
96 void setGridLinePen(const QPen& p);
97 QPen getGridLinePen() const;
98 // 设置绘制背景使用缓冲
99 void setPaintBackgroundInCache(bool on);
100 bool isPaintBackgroundInCache() const;
101
102 // 回退栈操作
103 QUndoStack& undoStack();
104 const QUndoStack& undoStack() const;
105 QUndoStack* getUndoStack() const;
106 void setUndoStackActive();
107 void push(QUndoCommand* cmd);
108
109 // 通过id查找item,此函数性能为O(n)
110 QGraphicsItem* findItemByID(uint64_t id, bool recursion = false) const;
111 static QGraphicsItem* findItemByID(const QList< QGraphicsItem* >& its, uint64_t id, bool recursion = false);
112
113 // 返回所有顶层的item
114 QList< QGraphicsItem* > topItems() const;
115 QList< QGraphicsItem* > topItems(const QPointF& scenePos) const;
116 // 选中的item
117 QList< DAGraphicsItem* > selectedDAItems() const;
118 // 设置场景就绪,如果场景还没加载完成,ready为false,一般这个函数在工程加载的时候应用
119 void setReady(bool on);
120 bool isReady() const;
121
122 // 是否当前存在场景动作
123 bool isHaveSceneAction() const;
124
125 // 获取图层
126 QList< DAGraphicsLayout* > getLayouts() const;
127 // 是否为只读模式,只读模式不能编辑
128 bool isReadOnly() const;
129 // 创建文本框
130 DAGraphicsTextItem* createText_(const QString& str = QString());
131 // 创建矩形
132 DAGraphicsRectItem* createRect_(const QPointF& p = QPointF());
133 // 注册命令工厂
134 void registCommandsFactory(DAGraphicsCommandsFactory* fac);
135 DAGraphicsCommandsFactory* commandsFactory();
136
137 // 判断点击的item是否可以移动
138 virtual bool isItemCanMove(QGraphicsItem* positem, const QPointF& scenePos);
139
140public:
141 // 获取默认的dpi
142 static int getDefaultDPI();
143 // dpi转为像素
144 static int dpiToPx(int dpi, int r);
145 // 把item添加到分组
146 static void addItemToGroup(QGraphicsItemGroup* group, const QList< QGraphicsItem* >& willGroupItems);
147public slots:
148 // 设置对齐网格
149 void setEnableSnapToGrid(bool on = true);
150 // 显示网格
151 void showGridLine(bool on);
152 // 选中所有item
153 int selectAll();
154 // 取消选择
155 int unselectAll();
156 // 取消选中
157 void clearSelection();
158 // 设置item的选中状态
159 int setSelectionState(const QList< QGraphicsItem* >& its, bool isSelect);
160 // 锁定,具体的锁定,有item自行处理,scene只是持有只读的状态,一般item在itemChange中判断是否只读,然后进行动作判断
161 void setReadOnly(bool on);
162 // 激活一个场景动作,DAAbstractGraphicsSceneAction的内存归scene管理,此函数发射sceneActionActived
163 void setupSceneAction(DA::DAAbstractGraphicsSceneAction* act);
164 // 清除场景动作,发射sceneActionDeactived信号
165 void clearSceneAction();
166signals:
177 void itemsPositionChanged(const QList< QGraphicsItem* >& items,
178 const QList< QPointF >& oldPos,
179 const QList< QPointF >& newPos);
180
186 void itemBodySizeChanged(DAGraphicsResizeableItem* item, const QSizeF& oldSize, const QSizeF& newSize);
187
193 void itemRotationChanged(DAGraphicsResizeableItem* item, const qreal& rotation);
194
203
209
215
224 void itemsAdded(const QList< QGraphicsItem* >& its);
225
234 void itemsRemoved(const QList< QGraphicsItem* >& its);
235
241
247
248protected:
249 // 调用此函数 主动触发itemsPositionChanged信号,这个函数用于 继承此类例如实现了键盘移动item,主动触发此信号
250 void emitItemsPositionChanged(const QList< QGraphicsItem* >& items,
251 const QList< QPointF >& oldPos,
252 const QList< QPointF >& newPos);
253 // 调用此函数 主动触发itemBodySizeChanged信号
254 void emitItemBodySizeChanged(DAGraphicsResizeableItem* item, const QSizeF& oldSize, const QSizeF& newSize);
255 // 调用此函数 主动触发itemRotationed信号
256 void emitItemRotationChanged(DAGraphicsResizeableItem* item, const qreal& rotation);
257 // 带信号的addItm
258 void addItemWithSignal(QGraphicsItem* item);
259
260protected:
261 // 鼠标点击事件
262 void mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
263 // 鼠标移动事件
264 void mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
265 // 鼠标释放
266 void mouseReleaseEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
267 // 绘制背景
268 void drawBackground(QPainter* painter, const QRectF& rect) override;
269private slots:
270 //
271 void onSelectionChanged();
272
273private:
274 void init();
275 void checkSelectItem(QGraphicsItem* item);
276 int changeAllSelection(bool setSelect);
277};
278}
279#endif // DAGRAPHICSSCENEWITHUNDOSTACK_H
这是一个scene的动作,DAGraphicsScene支持持有一个动作,这个动作可以捕获scene的所有界面事件
Definition DAAbstractGraphicsSceneAction.h:22
命令工厂
Definition DAGraphicsCommandsFactory.h:21
DAGraphicsView的基本元件
Definition DAGraphicsItem.h:19
绘制连接线的item
Definition DAGraphicsLinkItem.h:16
矩形图元
Definition DAGraphicsRectItem.h:13
用于调整大小的item
Definition DAGraphicsResizeableItem.h:48
这是带着undostack的GraphicsScene 此QGraphicsScene支持:
Definition DAGraphicsScene.h:30
void selectLinkChanged(DAGraphicsLinkItem *item)
选中的链接线发生了改变
void itemRotationChanged(DAGraphicsResizeableItem *item, const qreal &rotation)
item旋转发出的信号
void itemBodySizeChanged(DAGraphicsResizeableItem *item, const QSizeF &oldSize, const QSizeF &newSize)
条目bodysize改变触发的信号
void itemsAdded(const QList< QGraphicsItem * > &its)
item添加的信号
LinkMode
链接模式
Definition DAGraphicsScene.h:40
void sceneActionDeactived(DA::DAAbstractGraphicsSceneAction *act)
一个场景动作已经解除激活的信号
void linkCompleted(DAGraphicsLinkItem *linkItem)
完成了一次链接
void selectItemChanged(DAGraphicsItem *item)
选中的item发生了变化,注意,选中的如果是分组,会检查分组内部的item的点击,最终也是发送被点击的item
void itemsRemoved(const QList< QGraphicsItem * > &its)
item移除的信号
void itemsPositionChanged(const QList< QGraphicsItem * > &items, const QList< QPointF > &oldPos, const QList< QPointF > &newPos)
item移动发射的信号
void sceneActionActived(DA::DAAbstractGraphicsSceneAction *act)
一个场景动作被激活的信号
支持缩放编辑的文本框Item
Definition DAGraphicsTextItem.h:14
序列化类都是带异常的,使用中需要处理异常
Definition AppMainWindow.cpp:44