64 Q_DECLARE_PUBLIC(QGraphicsItem)
70 ExtraMaxDeviceCoordCacheSize,
71 ExtraBoundingRegionGranularity
76 AncestorHandlesChildEvents = 0x1,
77 AncestorClipsChildren = 0x2,
78 AncestorIgnoresTransformations = 0x4,
79 AncestorFiltersChildEvents = 0x8,
80 AncestorContainsChildren = 0x10
83 QGraphicsItemPrivate();
84 virtual ~QGraphicsItemPrivate();
86 static const QGraphicsItemPrivate *get(
const QGraphicsItem *item)
88 return item->d_ptr.data();
90 static QGraphicsItemPrivate *get(QGraphicsItem *item)
92 return item->d_ptr.data();
95 void updateChildWithGraphicsEffectFlagRecursively();
96 void updateAncestorFlag(QGraphicsItem::GraphicsItemFlag childFlag,
97 AncestorFlag flag = NoFlag,
bool enabled =
false,
bool root =
true);
98 void updateAncestorFlags();
99 void setIsMemberOfGroup(
bool enabled);
100 void remapItemPos(QEvent *event, QGraphicsItem *item);
101 QTransform genericMapFromSceneTransform(
const QWidget *viewport =
nullptr)
const;
102 QPointF genericMapFromScene(
const QPointF &pos,
const QWidget *viewport)
const;
103 inline bool itemIsUntransformable()
const
105 return (flags & QGraphicsItem::ItemIgnoresTransformations)
106 || (ancestorFlags & AncestorIgnoresTransformations);
109 void combineTransformToParent(QTransform *x,
const QTransform *viewTransform =
nullptr)
const;
110 void combineTransformFromParent(QTransform *x,
const QTransform *viewTransform =
nullptr)
const;
111 virtual void updateSceneTransformFromParent();
113 static bool movableAncestorIsSelected(
const QGraphicsItem *item);
115 virtual void setPosHelper(
const QPointF &pos);
116 void setTransformHelper(
const QTransform &transform);
117 void prependGraphicsTransform(QGraphicsTransform *t);
118 void appendGraphicsTransform(QGraphicsTransform *t);
119 void setVisibleHelper(
bool newVisible,
bool explicitly,
bool update =
true,
120 bool hiddenByPanel =
false);
121 void setEnabledHelper(
bool newEnabled,
bool explicitly,
bool update =
true);
122 bool discardUpdateRequest(
bool ignoreVisibleBit =
false,
123 bool ignoreDirtyBit =
false,
bool ignoreOpacity =
false)
const;
124 virtual void transformChanged() {}
126#if QT_CONFIG(graphicseffect)
127 enum InvalidateReason {
130 void invalidateParentGraphicsEffectsRecursively();
131 void invalidateChildGraphicsEffectsRecursively(InvalidateReason reason);
133 void invalidateDepthRecursively();
135 void addChild(QGraphicsItem *child);
136 void removeChild(QGraphicsItem *child);
137 void setParentItemHelper(QGraphicsItem *parent,
const QVariant *newParentVariant,
138 const QVariant *thisPointerVariant);
139 void childrenBoundingRectHelper(QTransform *x, QRectF *rect, QGraphicsItem *topMostEffectItem);
140 void initStyleOption(QStyleOptionGraphicsItem *option,
const QTransform &worldTransform,
141 const QRegion &exposedRegion,
bool allItems =
false)
const;
142 QRectF effectiveBoundingRect(QGraphicsItem *topMostEffectItem =
nullptr)
const;
143 QRectF sceneEffectiveBoundingRect()
const;
145 QRectF effectiveBoundingRect(
const QRectF &rect)
const;
147 virtual void resolveFont(uint inheritedMask)
149 for (
int i = 0; i < children.size(); ++i)
150 children.at(i)->d_ptr->resolveFont(inheritedMask);
153 virtual void resolvePalette(uint inheritedMask)
155 for (
int i = 0; i < children.size(); ++i)
156 children.at(i)->d_ptr->resolvePalette(inheritedMask);
159 virtual bool isProxyWidget()
const;
161 inline QVariant extra(Extra type)
const
163 for (
int i = 0; i < extras.size(); ++i) {
164 const ExtraStruct &extra = extras.at(i);
165 if (extra.type == type)
171 inline void setExtra(Extra type,
const QVariant &value)
174 for (
int i = 0; i < extras.size(); ++i) {
175 if (extras.at(i).type == type) {
182 extras << ExtraStruct(type, value);
184 extras[index].value = value;
188 inline void unsetExtra(Extra type)
190 for (
int i = 0; i < extras.size(); ++i) {
191 if (extras.at(i).type == type) {
200 ExtraStruct(Extra type,
const QVariant &value)
201 : type(type), value(value)
207 bool operator<(Extra extra)
const
208 {
return type < extra; }
211 QList<ExtraStruct> extras;
213 QGraphicsItemCache *maybeExtraItemCache()
const;
214 QGraphicsItemCache *extraItemCache()
const;
215 void removeExtraItemCache();
217 void updatePaintedViewBoundingRects(
bool updateChildren);
218 void ensureSceneTransformRecursive(QGraphicsItem **topMostDirtyItem);
219 inline void ensureSceneTransform()
221 QGraphicsItem *that = q_func();
222 ensureSceneTransformRecursive(&that);
225 inline bool hasTranslateOnlySceneTransform()
227 ensureSceneTransform();
228 return sceneTransformTranslateOnly;
231 inline void invalidateChildrenSceneTransform()
233 for (
int i = 0; i < children.size(); ++i)
234 children.at(i)->d_ptr->dirtySceneTransform = 1;
237 inline qreal calcEffectiveOpacity()
const
240 QGraphicsItem *p = parent;
243 int parentFlags = p->d_ptr->flags;
248 if ((myFlags & QGraphicsItem::ItemIgnoresParentOpacity)
249 || (parentFlags & QGraphicsItem::ItemDoesntPropagateOpacityToChildren)) {
253 o *= p->d_ptr->opacity;
254 p = p->d_ptr->parent;
255 myFlags = parentFlags;
260 inline bool isOpacityNull()
const
261 {
return (opacity < qreal(0.001)); }
263 static inline bool isOpacityNull(qreal opacity)
264 {
return (opacity < qreal(0.001)); }
266 inline bool isFullyTransparent()
const
273 return isOpacityNull(calcEffectiveOpacity());
276 inline qreal effectiveOpacity()
const {
277 if (!parent || !opacity)
280 return calcEffectiveOpacity();
283 inline qreal combineOpacityFromParent(qreal parentOpacity)
const
285 if (parent && !(flags & QGraphicsItem::ItemIgnoresParentOpacity)
286 && !(parent->d_ptr->flags & QGraphicsItem::ItemDoesntPropagateOpacityToChildren)) {
287 return parentOpacity * opacity;
292 inline bool childrenCombineOpacity()
const
294 if (!children.size())
296 if (flags & QGraphicsItem::ItemDoesntPropagateOpacityToChildren)
299 for (
int i = 0; i < children.size(); ++i) {
300 if (children.at(i)->d_ptr->flags & QGraphicsItem::ItemIgnoresParentOpacity)
306 inline bool childrenClippedToShape()
const
307 {
return (flags & QGraphicsItem::ItemClipsChildrenToShape) || children.isEmpty(); }
309 inline bool isInvisible()
const
311 return !visible || (childrenCombineOpacity() && isFullyTransparent());
314 inline void markParentDirty(
bool updateBoundingRect =
false);
316 void setFocusHelper(Qt::FocusReason focusReason,
bool climb,
bool focusFromHide);
317 void clearFocusHelper(
bool giveFocusToParent,
bool hiddenByParentPanel);
318 void setSubFocus(QGraphicsItem *rootItem =
nullptr, QGraphicsItem *stopItem =
nullptr);
319 void clearSubFocus(QGraphicsItem *rootItem =
nullptr, QGraphicsItem *stopItem =
nullptr);
320 void resetFocusProxy();
321 virtual void subFocusItemChange();
322 virtual void focusScopeItemChange(
bool isSubFocusItem);
324 inline QTransform transformToParent()
const;
325 inline void ensureSortedChildren();
326 static inline bool insertionOrder(QGraphicsItem *a, QGraphicsItem *b);
327 void ensureSequentialSiblingIndex();
328 inline void sendScenePosChange();
329 virtual void siblingOrderChange();
332 virtual qreal width()
const;
333 virtual void setWidth(qreal);
334 virtual void resetWidth();
336 virtual qreal height()
const;
337 virtual void setHeight(qreal);
338 virtual void resetHeight();
340 QRectF childrenBoundingRect;
342 QHash<QWidget *, QRect> paintedViewBoundingRects;
346 QGraphicsScene *scene;
347 QGraphicsItem *parent;
348 QList<QGraphicsItem *> children;
349 struct TransformData;
350 TransformData *transformData;
351 QGraphicsEffect *graphicsEffect;
352 QTransform sceneTransform;
356 QGraphicsItem *focusProxy;
357 QList<QGraphicsItem **> focusProxyRefs;
358 QGraphicsItem *subFocusItem;
359 QGraphicsItem *focusScopeItem;
360 Qt::InputMethodHints imHints;
361 QGraphicsItem::PanelModality panelModality;
362#ifndef QT_NO_GESTURES
363 QMap<Qt::GestureType, Qt::GestureFlags> gestureContext;
367 quint32 acceptedMouseButtons : 5;
369 quint32 explicitlyHidden : 1;
371 quint32 explicitlyDisabled : 1;
372 quint32 selected : 1;
373 quint32 acceptsHover : 1;
374 quint32 acceptDrops : 1;
375 quint32 isMemberOfGroup : 1;
376 quint32 handlesChildEvents : 1;
377 quint32 itemDiscovered : 1;
378 quint32 hasCursor : 1;
379 quint32 ancestorFlags : 5;
380 quint32 cacheMode : 2;
381 quint32 hasBoundingRegionGranularity : 1;
382 quint32 isWidget : 1;
384 quint32 dirtyChildren : 1;
385 quint32 localCollisionHack : 1;
386 quint32 inSetPosHelper : 1;
387 quint32 needSortChildren : 1;
388 quint32 allChildrenDirty : 1;
389 quint32 fullUpdatePending : 1;
393 quint32 paintedViewBoundingRectsNeedRepaint : 1;
394 quint32 dirtySceneTransform : 1;
395 quint32 geometryChanged : 1;
396 quint32 inDestructor : 1;
397 quint32 isObject : 1;
398 quint32 ignoreVisible : 1;
399 quint32 ignoreOpacity : 1;
400 quint32 acceptTouchEvents : 1;
401 quint32 acceptedTouchBeginEvent : 1;
402 quint32 filtersDescendantEvents : 1;
403 quint32 sceneTransformTranslateOnly : 1;
404 quint32 notifyBoundingRectChanged : 1;
409 quint32 notifyInvalidated : 1;
410 quint32 mouseSetsFocus : 1;
411 quint32 explicitActivate : 1;
412 quint32 wantsActive : 1;
413 quint32 holesInSiblingIndex : 1;
414 quint32 sequentialOrdering : 1;
415 quint32 updateDueToGraphicsEffect : 1;
416 quint32 scenePosDescendants : 1;
417 quint32 pendingPolish : 1;
418 quint32 mayHaveChildWithGraphicsEffect : 1;
419 quint32 sendParentChangeNotification : 1;
420 quint32 dirtyChildrenBoundingRect : 1;
421 quint32 padding : 20;
424 int globalStackingOrder;
425 QGraphicsItem *q_ptr;
684inline void QGraphicsItemPrivate::markParentDirty(
bool updateBoundingRect)
686 QGraphicsItemPrivate *parentp =
this;
687#if QT_CONFIG(graphicseffect)
688 if (updateBoundingRect && parentp->graphicsEffect && !parentp->inSetPosHelper) {
689 parentp->notifyInvalidated = 1;
690 static_cast<QGraphicsItemEffectSourcePrivate *>(parentp->graphicsEffect->d_func()
691 ->source->d_func())->invalidateCache();
694 while (parentp->parent) {
695 parentp = parentp->parent->d_ptr.data();
696 parentp->dirtyChildren = 1;
698 if (updateBoundingRect) {
699 parentp->dirtyChildrenBoundingRect = 1;
701 parentp->notifyBoundingRectChanged = 1;
703#if QT_CONFIG(graphicseffect)
704 if (parentp->graphicsEffect) {
705 if (updateBoundingRect) {
706 static_cast<QGraphicsItemEffectSourcePrivate *>(parentp->graphicsEffect->d_func()
707 ->source->d_func())->invalidateCache();
708 parentp->notifyInvalidated = 1;
710 if (parentp->scene && parentp->graphicsEffect->isEnabled()) {
712 parentp->fullUpdatePending = 1;
The QGraphicsSimpleTextItem class provides a simple text item that you can add to a QGraphicsScene.
The QGraphicsTextItem class provides a text item that you can add to a QGraphicsScene to display form...