1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtWidgets module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QGRAPHICSSCENE_H
41#define QGRAPHICSSCENE_H
42
43#include <QtWidgets/qtwidgetsglobal.h>
44#include <QtCore/qobject.h>
45#include <QtCore/qpoint.h>
46#include <QtCore/qrect.h>
47#include <QtGui/qbrush.h>
48#include <QtGui/qfont.h>
49#include <QtGui/qtransform.h>
50#include <QtGui/qpen.h>
51
52QT_REQUIRE_CONFIG(graphicsview);
53
54QT_BEGIN_NAMESPACE
55
56template<typename T> class QList;
57class QFocusEvent;
58class QFont;
59class QFontMetrics;
60class QGraphicsEllipseItem;
61class QGraphicsItem;
62class QGraphicsItemGroup;
63class QGraphicsLineItem;
64class QGraphicsPathItem;
65class QGraphicsPixmapItem;
66class QGraphicsPolygonItem;
67class QGraphicsProxyWidget;
68class QGraphicsRectItem;
69class QGraphicsSceneContextMenuEvent;
70class QGraphicsSceneDragDropEvent;
71class QGraphicsSceneEvent;
72class QGraphicsSceneHelpEvent;
73class QGraphicsSceneHoverEvent;
74class QGraphicsSceneMouseEvent;
75class QGraphicsSceneWheelEvent;
76class QGraphicsSimpleTextItem;
77class QGraphicsTextItem;
78class QGraphicsView;
79class QGraphicsWidget;
80class QGraphicsSceneIndex;
81class QHelpEvent;
82class QInputMethodEvent;
83class QKeyEvent;
84class QLineF;
85class QPainterPath;
86class QPixmap;
87class QPointF;
88class QPolygonF;
89class QRectF;
90class QSizeF;
91class QStyle;
92class QStyleOptionGraphicsItem;
93
94class QGraphicsScenePrivate;
95class Q_WIDGETS_EXPORT QGraphicsScene : public QObject
96{
97 Q_OBJECT
98 Q_PROPERTY(QBrush backgroundBrush READ backgroundBrush WRITE setBackgroundBrush)
99 Q_PROPERTY(QBrush foregroundBrush READ foregroundBrush WRITE setForegroundBrush)
100 Q_PROPERTY(ItemIndexMethod itemIndexMethod READ itemIndexMethod WRITE setItemIndexMethod)
101 Q_PROPERTY(QRectF sceneRect READ sceneRect WRITE setSceneRect)
102 Q_PROPERTY(int bspTreeDepth READ bspTreeDepth WRITE setBspTreeDepth)
103 Q_PROPERTY(QPalette palette READ palette WRITE setPalette)
104 Q_PROPERTY(QFont font READ font WRITE setFont)
105#if QT_DEPRECATED_SINCE(5, 13)
106 Q_PROPERTY(bool sortCacheEnabled READ isSortCacheEnabled WRITE setSortCacheEnabled)
107#endif
108 Q_PROPERTY(bool stickyFocus READ stickyFocus WRITE setStickyFocus)
109 Q_PROPERTY(qreal minimumRenderSize READ minimumRenderSize WRITE setMinimumRenderSize)
110 Q_PROPERTY(bool focusOnTouch READ focusOnTouch WRITE setFocusOnTouch)
111
112public:
113 enum ItemIndexMethod {
114 BspTreeIndex,
115 NoIndex = -1
116 };
117 Q_ENUM(ItemIndexMethod)
118 enum SceneLayer {
119 ItemLayer = 0x1,
120 BackgroundLayer = 0x2,
121 ForegroundLayer = 0x4,
122 AllLayers = 0xffff
123 };
124 Q_DECLARE_FLAGS(SceneLayers, SceneLayer)
125
126 QGraphicsScene(QObject *parent = nullptr);
127 QGraphicsScene(const QRectF &sceneRect, QObject *parent = nullptr);
128 QGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *parent = nullptr);
129 virtual ~QGraphicsScene();
130
131 QRectF sceneRect() const;
132 inline qreal width() const { return sceneRect().width(); }
133 inline qreal height() const { return sceneRect().height(); }
134 void setSceneRect(const QRectF &rect);
135 inline void setSceneRect(qreal x, qreal y, qreal w, qreal h)
136 { setSceneRect(QRectF(x, y, w, h)); }
137
138 void render(QPainter *painter,
139 const QRectF &target = QRectF(), const QRectF &source = QRectF(),
140 Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio);
141
142 ItemIndexMethod itemIndexMethod() const;
143 void setItemIndexMethod(ItemIndexMethod method);
144
145#if QT_DEPRECATED_SINCE(5, 13)
146 QT_DEPRECATED bool isSortCacheEnabled() const;
147 QT_DEPRECATED void setSortCacheEnabled(bool enabled);
148#endif
149
150 int bspTreeDepth() const;
151 void setBspTreeDepth(int depth);
152
153 QRectF itemsBoundingRect() const;
154
155 QList<QGraphicsItem *> items(Qt::SortOrder order = Qt::DescendingOrder) const;
156
157 QList<QGraphicsItem *> items(const QPointF &pos, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const;
158 QList<QGraphicsItem *> items(const QRectF &rect, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const;
159 QList<QGraphicsItem *> items(const QPolygonF &polygon, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const;
160 QList<QGraphicsItem *> items(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const;
161
162 QList<QGraphicsItem *> collidingItems(const QGraphicsItem *item, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const;
163#if QT_DEPRECATED_SINCE(5, 0)
164 QT_DEPRECATED inline QGraphicsItem *itemAt(const QPointF &position) const {
165 QList<QGraphicsItem *> itemsAtPoint = items(position);
166 return itemsAtPoint.isEmpty() ? nullptr : itemsAtPoint.first();
167 }
168#endif
169 QGraphicsItem *itemAt(const QPointF &pos, const QTransform &deviceTransform) const;
170#if QT_DEPRECATED_SINCE(5, 0)
171 QT_DEPRECATED inline QList<QGraphicsItem *> items(qreal x, qreal y, qreal w, qreal h, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
172 { return items(QRectF(x, y, w, h), mode); }
173#endif
174 inline QList<QGraphicsItem *> items(qreal x, qreal y, qreal w, qreal h, Qt::ItemSelectionMode mode, Qt::SortOrder order,
175 const QTransform &deviceTransform = QTransform()) const
176 { return items(rect: QRectF(x, y, w, h), mode, order, deviceTransform); }
177#if QT_DEPRECATED_SINCE(5, 0)
178 QT_DEPRECATED inline QGraphicsItem *itemAt(qreal x, qreal y) const {
179 QList<QGraphicsItem *> itemsAtPoint = items(QPointF(x, y));
180 return itemsAtPoint.isEmpty() ? nullptr : itemsAtPoint.first();
181 }
182#endif
183 inline QGraphicsItem *itemAt(qreal x, qreal y, const QTransform &deviceTransform) const
184 { return itemAt(pos: QPointF(x, y), deviceTransform); }
185
186 QList<QGraphicsItem *> selectedItems() const;
187 QPainterPath selectionArea() const;
188 void setSelectionArea(const QPainterPath &path, const QTransform &deviceTransform);
189 void setSelectionArea(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, const QTransform &deviceTransform = QTransform());
190 void setSelectionArea(const QPainterPath &path, Qt::ItemSelectionOperation selectionOperation, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, const QTransform &deviceTransform = QTransform());
191 // ### Qt6 merge the last 2 functions and add a default: Qt::ItemSelectionOperation selectionOperation = Qt::ReplaceSelection
192
193 QGraphicsItemGroup *createItemGroup(const QList<QGraphicsItem *> &items);
194 void destroyItemGroup(QGraphicsItemGroup *group);
195
196 void addItem(QGraphicsItem *item);
197 QGraphicsEllipseItem *addEllipse(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush());
198 QGraphicsLineItem *addLine(const QLineF &line, const QPen &pen = QPen());
199 QGraphicsPathItem *addPath(const QPainterPath &path, const QPen &pen = QPen(), const QBrush &brush = QBrush());
200 QGraphicsPixmapItem *addPixmap(const QPixmap &pixmap);
201 QGraphicsPolygonItem *addPolygon(const QPolygonF &polygon, const QPen &pen = QPen(), const QBrush &brush = QBrush());
202 QGraphicsRectItem *addRect(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush());
203 QGraphicsTextItem *addText(const QString &text, const QFont &font = QFont());
204 QGraphicsSimpleTextItem *addSimpleText(const QString &text, const QFont &font = QFont());
205 QGraphicsProxyWidget *addWidget(QWidget *widget, Qt::WindowFlags wFlags = Qt::WindowFlags());
206 inline QGraphicsEllipseItem *addEllipse(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())
207 { return addEllipse(rect: QRectF(x, y, w, h), pen, brush); }
208 inline QGraphicsLineItem *addLine(qreal x1, qreal y1, qreal x2, qreal y2, const QPen &pen = QPen())
209 { return addLine(line: QLineF(x1, y1, x2, y2), pen); }
210 inline QGraphicsRectItem *addRect(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())
211 { return addRect(rect: QRectF(x, y, w, h), pen, brush); }
212 void removeItem(QGraphicsItem *item);
213
214 QGraphicsItem *focusItem() const;
215 void setFocusItem(QGraphicsItem *item, Qt::FocusReason focusReason = Qt::OtherFocusReason);
216 bool hasFocus() const;
217 void setFocus(Qt::FocusReason focusReason = Qt::OtherFocusReason);
218 void clearFocus();
219
220 void setStickyFocus(bool enabled);
221 bool stickyFocus() const;
222
223 QGraphicsItem *mouseGrabberItem() const;
224
225 QBrush backgroundBrush() const;
226 void setBackgroundBrush(const QBrush &brush);
227
228 QBrush foregroundBrush() const;
229 void setForegroundBrush(const QBrush &brush);
230
231 virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
232
233 QList <QGraphicsView *> views() const;
234
235 inline void update(qreal x, qreal y, qreal w, qreal h)
236 { update(rect: QRectF(x, y, w, h)); }
237 inline void invalidate(qreal x, qreal y, qreal w, qreal h, SceneLayers layers = AllLayers)
238 { invalidate(rect: QRectF(x, y, w, h), layers); }
239
240 QStyle *style() const;
241 void setStyle(QStyle *style);
242
243 QFont font() const;
244 void setFont(const QFont &font);
245
246 QPalette palette() const;
247 void setPalette(const QPalette &palette);
248
249 bool isActive() const;
250 QGraphicsItem *activePanel() const;
251 void setActivePanel(QGraphicsItem *item);
252 QGraphicsWidget *activeWindow() const;
253 void setActiveWindow(QGraphicsWidget *widget);
254
255 bool sendEvent(QGraphicsItem *item, QEvent *event);
256
257 qreal minimumRenderSize() const;
258 void setMinimumRenderSize(qreal minSize);
259
260 bool focusOnTouch() const;
261 void setFocusOnTouch(bool enabled);
262
263public Q_SLOTS:
264 void update(const QRectF &rect = QRectF());
265 void invalidate(const QRectF &rect = QRectF(), SceneLayers layers = AllLayers);
266 void advance();
267 void clearSelection();
268 void clear();
269
270protected:
271 bool event(QEvent *event) override;
272 bool eventFilter(QObject *watched, QEvent *event) override;
273 virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
274 virtual void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
275 virtual void dragMoveEvent(QGraphicsSceneDragDropEvent *event);
276 virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
277 virtual void dropEvent(QGraphicsSceneDragDropEvent *event);
278 virtual void focusInEvent(QFocusEvent *event);
279 virtual void focusOutEvent(QFocusEvent *event);
280 virtual void helpEvent(QGraphicsSceneHelpEvent *event);
281 virtual void keyPressEvent(QKeyEvent *event);
282 virtual void keyReleaseEvent(QKeyEvent *event);
283 virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
284 virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
285 virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
286 virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
287 virtual void wheelEvent(QGraphicsSceneWheelEvent *event);
288 virtual void inputMethodEvent(QInputMethodEvent *event);
289
290 virtual void drawBackground(QPainter *painter, const QRectF &rect);
291 virtual void drawForeground(QPainter *painter, const QRectF &rect);
292 virtual void drawItems(QPainter *painter, int numItems,
293 QGraphicsItem *items[],
294 const QStyleOptionGraphicsItem options[],
295 QWidget *widget = nullptr);
296
297protected Q_SLOTS:
298 QT6_VIRTUAL bool focusNextPrevChild(bool next);
299
300Q_SIGNALS:
301 void changed(const QList<QRectF> &region);
302 void sceneRectChanged(const QRectF &rect);
303 void selectionChanged();
304 void focusItemChanged(QGraphicsItem *newFocus, QGraphicsItem *oldFocus, Qt::FocusReason reason);
305
306private:
307 Q_DECLARE_PRIVATE(QGraphicsScene)
308 Q_DISABLE_COPY(QGraphicsScene)
309 Q_PRIVATE_SLOT(d_func(), void _q_emitUpdated())
310 Q_PRIVATE_SLOT(d_func(), void _q_polishItems())
311 Q_PRIVATE_SLOT(d_func(), void _q_processDirtyItems())
312 Q_PRIVATE_SLOT(d_func(), void _q_updateScenePosDescendants())
313 friend class QGraphicsItem;
314 friend class QGraphicsItemPrivate;
315 friend class QGraphicsObject;
316 friend class QGraphicsView;
317 friend class QGraphicsViewPrivate;
318 friend class QGraphicsWidget;
319 friend class QGraphicsWidgetPrivate;
320 friend class QGraphicsEffect;
321 friend class QGraphicsSceneIndex;
322 friend class QGraphicsSceneIndexPrivate;
323 friend class QGraphicsSceneBspTreeIndex;
324 friend class QGraphicsSceneBspTreeIndexPrivate;
325 friend class QGraphicsItemEffectSourcePrivate;
326#ifndef QT_NO_GESTURES
327 friend class QGesture;
328#endif
329};
330
331Q_DECLARE_OPERATORS_FOR_FLAGS(QGraphicsScene::SceneLayers)
332
333QT_END_NAMESPACE
334
335#endif
336

source code of qtbase/src/widgets/graphicsview/qgraphicsscene.h