50 Q_DECLARE_PUBLIC(QGraphicsScene)
52 QGraphicsScenePrivate();
55 static QGraphicsScenePrivate *get(QGraphicsScene *q);
57 int changedSignalIndex;
58 int processDirtyItemsIndex;
61 QGraphicsScene::ItemIndexMethod indexMethod;
62 QGraphicsSceneIndex *index;
68 quint32 hasSceneRect : 1;
69 quint32 dirtyGrowingItemsBoundingRect : 1;
70 quint32 updateAll : 1;
71 quint32 calledEmitUpdated : 1;
72 quint32 processDirtyItemsEmitted : 1;
73 quint32 needSortTopLevelItems : 1;
74 quint32 holesInTopLevelSiblingIndex : 1;
75 quint32 topLevelSequentialOrdering : 1;
76 quint32 scenePosDescendantsUpdatePending : 1;
77 quint32 stickyFocus : 1;
79 quint32 lastMouseGrabberItemHasImplicitMouseGrab : 1;
80 quint32 allItemsIgnoreHoverEvents : 1;
81 quint32 allItemsUseDefaultCursor : 1;
82 quint32 painterStateProtection : 1;
83 quint32 sortCacheEnabled : 1;
84 quint32 allItemsIgnoreTouchEvents : 1;
85 quint32 focusOnTouch : 1;
88 qreal minimumRenderSize;
90 QRectF growingItemsBoundingRect;
92 void _q_emitUpdated();
94 struct UpdatedRectsCmp
96 bool operator() (
const QRectF &a,
const QRectF &b)
const noexcept
98 return std::make_tuple(a.y(), a.x(), a.height(), a.width())
99 < std::make_tuple(b.y(), b.x(), b.height(), b.width());
105 std::set<QRectF, UpdatedRectsCmp> updatedRects;
107 QPainterPath selectionArea;
108 int selectionChanging;
109 QSet<QGraphicsItem *> selectedItems;
110 QList<QGraphicsItem *> unpolishedItems;
111 QList<QGraphicsItem *> topLevelItems;
113 QHash<QGraphicsItem *, QPointF> movingItemsInitialPositions;
114 void registerTopLevelItem(QGraphicsItem *item);
115 void unregisterTopLevelItem(QGraphicsItem *item);
116 void _q_updateLater();
117 void _q_polishItems();
119 void _q_processDirtyItems();
121 QSet<QGraphicsItem *> scenePosItems;
122 void setScenePosItemEnabled(QGraphicsItem *item,
bool enabled);
123 void registerScenePosItem(QGraphicsItem *item);
124 void unregisterScenePosItem(QGraphicsItem *item);
125 void _q_updateScenePosDescendants();
127 void removeItemHelper(QGraphicsItem *item);
129 QBrush backgroundBrush;
130 QBrush foregroundBrush;
133 QGraphicsItem *focusItem;
134 QGraphicsItem *lastFocusItem;
135 QGraphicsItem *passiveFocusItem;
136 QGraphicsWidget *tabFocusFirst;
137 QGraphicsItem *activePanel;
138 QGraphicsItem *lastActivePanel;
139 int activationRefCount;
140 int childExplicitActivation;
141 void setActivePanelHelper(QGraphicsItem *item,
bool duringActivationEvent);
142 void setFocusItemHelper(QGraphicsItem *item, Qt::FocusReason focusReason,
143 bool emitFocusChanged =
true);
145 QList<QGraphicsWidget *> popupWidgets;
146 void addPopup(QGraphicsWidget *widget);
147 void removePopup(QGraphicsWidget *widget,
bool itemIsDying =
false);
149 QGraphicsItem *lastMouseGrabberItem;
150 QList<QGraphicsItem *> mouseGrabberItems;
151 void grabMouse(QGraphicsItem *item,
bool implicit =
false);
152 void ungrabMouse(QGraphicsItem *item,
bool itemIsDying =
false);
153 void clearMouseGrabber();
155 QList<QGraphicsItem *> keyboardGrabberItems;
156 void grabKeyboard(QGraphicsItem *item);
157 void ungrabKeyboard(QGraphicsItem *item,
bool itemIsDying =
false);
158 void clearKeyboardGrabber();
160 QGraphicsItem *dragDropItem;
161 QGraphicsWidget *enterWidget;
162 Qt::DropAction lastDropAction;
163 QList<QGraphicsItem *> cachedItemsUnderMouse;
164 QList<QGraphicsItem *> hoverItems;
165 QPointF lastSceneMousePos;
166 void enableMouseTrackingOnViews();
167 QMap<Qt::MouseButton, QPointF> mouseGrabberButtonDownPos;
168 QMap<Qt::MouseButton, QPointF> mouseGrabberButtonDownScenePos;
169 QMap<Qt::MouseButton, QPoint> mouseGrabberButtonDownScreenPos;
170 QList<QGraphicsItem *> itemsAtPosition(
const QPoint &screenPos,
171 const QPointF &scenePos,
172 QWidget *widget)
const;
173 void storeMouseButtonsForMouseGrabber(QGraphicsSceneMouseEvent *event);
175 QList<QGraphicsView *> views;
176 void addView(QGraphicsView *view);
177 void removeView(QGraphicsView *view);
179 QMultiMap<QGraphicsItem *, QGraphicsItem *> sceneEventFilters;
180 void installSceneEventFilter(QGraphicsItem *watched, QGraphicsItem *filter);
181 void removeSceneEventFilter(QGraphicsItem *watched, QGraphicsItem *filter);
182 bool filterDescendantEvent(QGraphicsItem *item, QEvent *event);
183 bool filterEvent(QGraphicsItem *item, QEvent *event);
184 bool sendEvent(QGraphicsItem *item, QEvent *event);
186 bool dispatchHoverEvent(QGraphicsSceneHoverEvent *hoverEvent);
187 bool itemAcceptsHoverEvents_helper(
const QGraphicsItem *item)
const;
188 void leaveScene(QWidget *viewport);
190 void cloneDragDropEvent(QGraphicsSceneDragDropEvent *dest,
191 QGraphicsSceneDragDropEvent *source);
192 void sendDragDropEvent(QGraphicsItem *item,
193 QGraphicsSceneDragDropEvent *dragDropEvent);
194 void sendHoverEvent(QEvent::Type type, QGraphicsItem *item,
195 QGraphicsSceneHoverEvent *hoverEvent);
196 void sendMouseEvent(QGraphicsSceneMouseEvent *mouseEvent);
197 void mousePressEventHandler(QGraphicsSceneMouseEvent *mouseEvent);
198 QGraphicsWidget *windowForItem(
const QGraphicsItem *item)
const;
200 void drawItemHelper(QGraphicsItem *item, QPainter *painter,
201 const QStyleOptionGraphicsItem *option, QWidget *widget,
202 bool painterStateProtection);
204 void drawItems(QPainter *painter,
const QTransform *
const viewTransform,
205 QRegion *exposedRegion, QWidget *widget);
207 void drawSubtreeRecursive(QGraphicsItem *item, QPainter *painter,
const QTransform *
const,
208 QRegion *exposedRegion, QWidget *widget, qreal parentOpacity = qreal(1.0),
209 const QTransform *
const effectTransform =
nullptr);
210 void draw(QGraphicsItem *, QPainter *,
const QTransform *
const,
const QTransform *
const,
211 QRegion *, QWidget *, qreal,
const QTransform *
const,
bool,
bool);
213 void markDirty(QGraphicsItem *item,
const QRectF &rect = QRectF(),
bool invalidateChildren =
false,
214 bool force =
false,
bool ignoreOpacity =
false,
bool removingItemFromScene =
false,
215 bool updateBoundingRect =
false);
216 void processDirtyItemsRecursive(QGraphicsItem *item,
bool dirtyAncestorContainsChildren =
false,
217 qreal parentOpacity = qreal(1.0));
219 inline void resetDirtyItem(QGraphicsItem *item,
bool recursive =
false)
222 item->d_ptr->dirty = 0;
223 item->d_ptr->paintedViewBoundingRectsNeedRepaint = 0;
224 item->d_ptr->geometryChanged = 0;
225 if (!item->d_ptr->dirtyChildren)
227 item->d_ptr->dirtyChildren = 0;
228 item->d_ptr->needsRepaint = QRectF();
229 item->d_ptr->allChildrenDirty = 0;
230 item->d_ptr->fullUpdatePending = 0;
231 item->d_ptr->ignoreVisible = 0;
232 item->d_ptr->ignoreOpacity = 0;
233#if QT_CONFIG(graphicseffect)
234 QGraphicsEffect::ChangeFlags flags;
235 if (item->d_ptr->notifyBoundingRectChanged) {
236 flags |= QGraphicsEffect::SourceBoundingRectChanged;
237 item->d_ptr->notifyBoundingRectChanged = 0;
239 if (item->d_ptr->notifyInvalidated) {
240 flags |= QGraphicsEffect::SourceInvalidated;
241 item->d_ptr->notifyInvalidated = 0;
245 for (
int i = 0; i < item->d_ptr->children.size(); ++i)
246 resetDirtyItem(item->d_ptr->children.at(i), recursive);
248#if QT_CONFIG(graphicseffect)
249 if (flags && item->d_ptr->graphicsEffect)
250 item->d_ptr->graphicsEffect->sourceChanged(flags);
254 inline void ensureSortedTopLevelItems()
256 if (needSortTopLevelItems) {
257 std::sort(topLevelItems.begin(), topLevelItems.end(), qt_notclosestLeaf);
258 topLevelSequentialOrdering =
false;
259 needSortTopLevelItems =
false;
263 void ensureSequentialTopLevelSiblingIndexes();
267 void setFont_helper(
const QFont &font);
269 void updateFont(
const QFont &font);
271 void setPalette_helper(
const QPalette &palette);
272 void resolvePalette();
273 void updatePalette(
const QPalette &palette);
275 QStyleOptionGraphicsItem styleOptionTmp;
277 QMap<
int, QEventPoint> sceneCurrentTouchPoints;
278 QMap<
int, QGraphicsItem *> itemForTouchPointId;
279 static void updateTouchPointsForItem(QGraphicsItem *item, QTouchEvent *touchEvent);
280 int findClosestTouchPointId(
const QPointF &scenePos);
281 void touchEventHandler(QTouchEvent *touchEvent);
282 bool sendTouchBeginEvent(QGraphicsItem *item, QTouchEvent *touchEvent);
283 void enableTouchEventsOnViews();
285 QList<QGraphicsObject *> cachedTargetItems;
286#ifndef QT_NO_GESTURES
287 QHash<QGraphicsObject *, QSet<QGesture *> > cachedItemGestures;
288 QHash<QGraphicsObject *, QSet<QGesture *> > cachedAlreadyDeliveredGestures;
289 QHash<QGesture *, QGraphicsObject *> gestureTargets;
290 QHash<Qt::GestureType,
int> grabbedGestures;
291 void gestureEventHandler(QGestureEvent *event);
292 void gestureTargetsAtHotSpots(
const QSet<QGesture *> &gestures,
293 Qt::GestureFlag flag,
294 QHash<QGraphicsObject *, QSet<QGesture *> > *targets,
295 QSet<QGraphicsObject *> *itemsSet =
nullptr,
296 QSet<QGesture *> *normal =
nullptr,
297 QSet<QGesture *> *conflicts =
nullptr);
298 void cancelGesturesForChildren(QGesture *original);
299 void grabGesture(QGraphicsItem *, Qt::GestureType gesture);
300 void ungrabGesture(QGraphicsItem *, Qt::GestureType gesture);
303 void updateInputMethodSensitivityInViews();
305 QList<QGraphicsItem *> modalPanels;
306 void enterModal(QGraphicsItem *item,
307 QGraphicsItem::PanelModality panelModality = QGraphicsItem::NonModal);
308 void leaveModal(QGraphicsItem *item);