Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-22 09:04:35

0001 // Copyright (C) 2016 The Qt Company Ltd.
0002 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
0003 // Qt-Security score:significant reason:default
0004 
0005 #ifndef QGRAPHICSITEM_H
0006 #define QGRAPHICSITEM_H
0007 
0008 #include <QtWidgets/qtwidgetsglobal.h>
0009 #include <QtCore/qobject.h>
0010 #include <QtCore/qvariant.h>
0011 #include <QtCore/qrect.h>
0012 #include <QtCore/qscopedpointer.h>
0013 #include <QtGui/qpainterpath.h>
0014 #include <QtGui/qpixmap.h>
0015 
0016 class tst_QGraphicsItem;
0017 
0018 QT_REQUIRE_CONFIG(graphicsview);
0019 
0020 QT_BEGIN_NAMESPACE
0021 
0022 class QBrush;
0023 class QCursor;
0024 class QFocusEvent;
0025 class QGraphicsEffect;
0026 class QGraphicsItemGroup;
0027 class QGraphicsObject;
0028 class QGraphicsSceneContextMenuEvent;
0029 class QGraphicsSceneDragDropEvent;
0030 class QGraphicsSceneEvent;
0031 class QGraphicsSceneHoverEvent;
0032 class QGraphicsSceneMouseEvent;
0033 class QGraphicsSceneWheelEvent;
0034 class QGraphicsScene;
0035 class QGraphicsTransform;
0036 class QGraphicsWidget;
0037 class QInputMethodEvent;
0038 class QKeyEvent;
0039 class QMenu;
0040 class QPainter;
0041 class QPen;
0042 class QPointF;
0043 class QRectF;
0044 class QStyleOptionGraphicsItem;
0045 
0046 class QGraphicsItemPrivate;
0047 class Q_WIDGETS_EXPORT QGraphicsItem
0048 {
0049 public:
0050     enum GraphicsItemFlag {
0051         ItemIsMovable = 0x1,
0052         ItemIsSelectable = 0x2,
0053         ItemIsFocusable = 0x4,
0054         ItemClipsToShape = 0x8,
0055         ItemClipsChildrenToShape = 0x10,
0056         ItemIgnoresTransformations = 0x20,
0057         ItemIgnoresParentOpacity = 0x40,
0058         ItemDoesntPropagateOpacityToChildren = 0x80,
0059         ItemStacksBehindParent = 0x100,
0060         ItemUsesExtendedStyleOption = 0x200,
0061         ItemHasNoContents = 0x400,
0062         ItemSendsGeometryChanges = 0x800,
0063         ItemAcceptsInputMethod = 0x1000,
0064         ItemNegativeZStacksBehindParent = 0x2000,
0065         ItemIsPanel = 0x4000,
0066         ItemIsFocusScope = 0x8000, // internal
0067         ItemSendsScenePositionChanges = 0x10000,
0068         ItemStopsClickFocusPropagation = 0x20000,
0069         ItemStopsFocusHandling = 0x40000,
0070         ItemContainsChildrenInShape = 0x80000
0071         // NB! Don't forget to increase the d_ptr->flags bit field by 1 when adding a new flag.
0072     };
0073     Q_DECLARE_FLAGS(GraphicsItemFlags, GraphicsItemFlag)
0074 
0075     enum GraphicsItemChange {
0076         ItemPositionChange,
0077         ItemVisibleChange = 2,
0078         ItemEnabledChange,
0079         ItemSelectedChange,
0080         ItemParentChange,
0081         ItemChildAddedChange,
0082         ItemChildRemovedChange,
0083         ItemTransformChange,
0084         ItemPositionHasChanged,
0085         ItemTransformHasChanged,
0086         ItemSceneChange,
0087         ItemVisibleHasChanged,
0088         ItemEnabledHasChanged,
0089         ItemSelectedHasChanged,
0090         ItemParentHasChanged,
0091         ItemSceneHasChanged,
0092         ItemCursorChange,
0093         ItemCursorHasChanged,
0094         ItemToolTipChange,
0095         ItemToolTipHasChanged,
0096         ItemFlagsChange,
0097         ItemFlagsHaveChanged,
0098         ItemZValueChange,
0099         ItemZValueHasChanged,
0100         ItemOpacityChange,
0101         ItemOpacityHasChanged,
0102         ItemScenePositionHasChanged,
0103         ItemRotationChange,
0104         ItemRotationHasChanged,
0105         ItemScaleChange,
0106         ItemScaleHasChanged,
0107         ItemTransformOriginPointChange,
0108         ItemTransformOriginPointHasChanged
0109     };
0110 
0111     enum CacheMode {
0112         NoCache,
0113         ItemCoordinateCache,
0114         DeviceCoordinateCache
0115     };
0116 
0117     enum PanelModality
0118     {
0119         NonModal,
0120         PanelModal,
0121         SceneModal
0122     };
0123 
0124     explicit QGraphicsItem(QGraphicsItem *parent = nullptr);
0125     virtual ~QGraphicsItem();
0126 
0127     QGraphicsScene *scene() const;
0128 
0129     QGraphicsItem *parentItem() const;
0130     QGraphicsItem *topLevelItem() const;
0131     QGraphicsObject *parentObject() const;
0132     QGraphicsWidget *parentWidget() const;
0133     QGraphicsWidget *topLevelWidget() const;
0134     QGraphicsWidget *window() const;
0135     QGraphicsItem *panel() const;
0136     void setParentItem(QGraphicsItem *parent);
0137     QList<QGraphicsItem *> childItems() const;
0138     bool isWidget() const;
0139     bool isWindow() const;
0140     bool isPanel() const;
0141 
0142     QGraphicsObject *toGraphicsObject();
0143     const QGraphicsObject *toGraphicsObject() const;
0144 
0145     QGraphicsItemGroup *group() const;
0146     void setGroup(QGraphicsItemGroup *group);
0147 
0148     GraphicsItemFlags flags() const;
0149     void setFlag(GraphicsItemFlag flag, bool enabled = true);
0150     void setFlags(GraphicsItemFlags flags);
0151 
0152     CacheMode cacheMode() const;
0153     void setCacheMode(CacheMode mode, const QSize &cacheSize = QSize());
0154 
0155     PanelModality panelModality() const;
0156     void setPanelModality(PanelModality panelModality);
0157     bool isBlockedByModalPanel(QGraphicsItem **blockingPanel = nullptr) const;
0158 
0159 #if QT_CONFIG(tooltip)
0160     QString toolTip() const;
0161     void setToolTip(const QString &toolTip);
0162 #endif
0163 
0164 #ifndef QT_NO_CURSOR
0165     QCursor cursor() const;
0166     void setCursor(const QCursor &cursor);
0167     bool hasCursor() const;
0168     void unsetCursor();
0169 #endif
0170 
0171     bool isVisible() const;
0172     bool isVisibleTo(const QGraphicsItem *parent) const;
0173     void setVisible(bool visible);
0174     inline void hide() { setVisible(false); }
0175     inline void show() { setVisible(true); }
0176 
0177     bool isEnabled() const;
0178     void setEnabled(bool enabled);
0179 
0180     bool isSelected() const;
0181     void setSelected(bool selected);
0182 
0183     bool acceptDrops() const;
0184     void setAcceptDrops(bool on);
0185 
0186     qreal opacity() const;
0187     qreal effectiveOpacity() const;
0188     void setOpacity(qreal opacity);
0189 
0190 #if QT_CONFIG(graphicseffect)
0191     // Effect
0192     QGraphicsEffect *graphicsEffect() const;
0193     void setGraphicsEffect(QGraphicsEffect *effect);
0194 #endif // QT_CONFIG(graphicseffect)
0195 
0196     Qt::MouseButtons acceptedMouseButtons() const;
0197     void setAcceptedMouseButtons(Qt::MouseButtons buttons);
0198     bool acceptHoverEvents() const;
0199     void setAcceptHoverEvents(bool enabled);
0200     bool acceptTouchEvents() const;
0201     void setAcceptTouchEvents(bool enabled);
0202 
0203     bool filtersChildEvents() const;
0204     void setFiltersChildEvents(bool enabled);
0205 
0206     bool handlesChildEvents() const;
0207     void setHandlesChildEvents(bool enabled);
0208 
0209     bool isActive() const;
0210     void setActive(bool active);
0211 
0212     bool hasFocus() const;
0213     void setFocus(Qt::FocusReason focusReason = Qt::OtherFocusReason);
0214     void clearFocus();
0215 
0216     QGraphicsItem *focusProxy() const;
0217     void setFocusProxy(QGraphicsItem *item);
0218 
0219     QGraphicsItem *focusItem() const;
0220     QGraphicsItem *focusScopeItem() const;
0221 
0222     void grabMouse();
0223     void ungrabMouse();
0224     void grabKeyboard();
0225     void ungrabKeyboard();
0226 
0227     // Positioning in scene coordinates
0228     QPointF pos() const;
0229     inline qreal x() const { return pos().x(); }
0230     void setX(qreal x);
0231     inline qreal y() const { return pos().y(); }
0232     void setY(qreal y);
0233     QPointF scenePos() const;
0234     void setPos(const QPointF &pos);
0235     inline void setPos(qreal x, qreal y);
0236     inline void moveBy(qreal dx, qreal dy) { setPos(pos().x() + dx, pos().y() + dy); }
0237 
0238     void ensureVisible(const QRectF &rect = QRectF(), int xmargin = 50, int ymargin = 50);
0239     inline void ensureVisible(qreal x, qreal y, qreal w, qreal h, int xmargin = 50, int ymargin = 50);
0240 
0241     // Local transformation
0242     QTransform transform() const;
0243     QTransform sceneTransform() const;
0244     QTransform deviceTransform(const QTransform &viewportTransform) const;
0245     QTransform itemTransform(const QGraphicsItem *other, bool *ok = nullptr) const;
0246     void setTransform(const QTransform &matrix, bool combine = false);
0247     void resetTransform();
0248     void setRotation(qreal angle);
0249     qreal rotation() const;
0250 
0251     void setScale(qreal scale);
0252     qreal scale() const;
0253 
0254     QList<QGraphicsTransform *> transformations() const;
0255     void setTransformations(const QList<QGraphicsTransform *> &transformations);
0256 
0257     QPointF transformOriginPoint() const;
0258     void setTransformOriginPoint(const QPointF &origin);
0259     inline void setTransformOriginPoint(qreal ax, qreal ay)
0260     { setTransformOriginPoint(QPointF(ax,ay)); }
0261 
0262     virtual void advance(int phase);
0263 
0264     // Stacking order
0265     qreal zValue() const;
0266     void setZValue(qreal z);
0267     void stackBefore(const QGraphicsItem *sibling);
0268 
0269     // Hit test
0270     virtual QRectF boundingRect() const = 0;
0271     QRectF childrenBoundingRect() const;
0272     QRectF sceneBoundingRect() const;
0273     virtual QPainterPath shape() const;
0274     bool isClipped() const;
0275     QPainterPath clipPath() const;
0276     virtual bool contains(const QPointF &point) const;
0277     virtual bool collidesWithItem(const QGraphicsItem *other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const;
0278     virtual bool collidesWithPath(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const;
0279     QList<QGraphicsItem *> collidingItems(Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const;
0280     bool isObscured(const QRectF &rect = QRectF()) const;
0281     inline bool isObscured(qreal x, qreal y, qreal w, qreal h) const;
0282     virtual bool isObscuredBy(const QGraphicsItem *item) const;
0283     virtual QPainterPath opaqueArea() const;
0284 
0285     QRegion boundingRegion(const QTransform &itemToDeviceTransform) const;
0286     qreal boundingRegionGranularity() const;
0287     void setBoundingRegionGranularity(qreal granularity);
0288 
0289     // Drawing
0290     virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) = 0;
0291     void update(const QRectF &rect = QRectF());
0292     inline void update(qreal x, qreal y, qreal width, qreal height);
0293     void scroll(qreal dx, qreal dy, const QRectF &rect = QRectF());
0294 
0295     // Coordinate mapping
0296     QPointF mapToItem(const QGraphicsItem *item, const QPointF &point) const;
0297     QPointF mapToParent(const QPointF &point) const;
0298     QPointF mapToScene(const QPointF &point) const;
0299     QPolygonF mapToItem(const QGraphicsItem *item, const QRectF &rect) const;
0300     QPolygonF mapToParent(const QRectF &rect) const;
0301     QPolygonF mapToScene(const QRectF &rect) const;
0302     QRectF mapRectToItem(const QGraphicsItem *item, const QRectF &rect) const;
0303     QRectF mapRectToParent(const QRectF &rect) const;
0304     QRectF mapRectToScene(const QRectF &rect) const;
0305     QPolygonF mapToItem(const QGraphicsItem *item, const QPolygonF &polygon) const;
0306     QPolygonF mapToParent(const QPolygonF &polygon) const;
0307     QPolygonF mapToScene(const QPolygonF &polygon) const;
0308     QPainterPath mapToItem(const QGraphicsItem *item, const QPainterPath &path) const;
0309     QPainterPath mapToParent(const QPainterPath &path) const;
0310     QPainterPath mapToScene(const QPainterPath &path) const;
0311     QPointF mapFromItem(const QGraphicsItem *item, const QPointF &point) const;
0312     QPointF mapFromParent(const QPointF &point) const;
0313     QPointF mapFromScene(const QPointF &point) const;
0314     QPolygonF mapFromItem(const QGraphicsItem *item, const QRectF &rect) const;
0315     QPolygonF mapFromParent(const QRectF &rect) const;
0316     QPolygonF mapFromScene(const QRectF &rect) const;
0317     QRectF mapRectFromItem(const QGraphicsItem *item, const QRectF &rect) const;
0318     QRectF mapRectFromParent(const QRectF &rect) const;
0319     QRectF mapRectFromScene(const QRectF &rect) const;
0320     QPolygonF mapFromItem(const QGraphicsItem *item, const QPolygonF &polygon) const;
0321     QPolygonF mapFromParent(const QPolygonF &polygon) const;
0322     QPolygonF mapFromScene(const QPolygonF &polygon) const;
0323     QPainterPath mapFromItem(const QGraphicsItem *item, const QPainterPath &path) const;
0324     QPainterPath mapFromParent(const QPainterPath &path) const;
0325     QPainterPath mapFromScene(const QPainterPath &path) const;
0326 
0327     inline QPointF mapToItem(const QGraphicsItem *item, qreal x, qreal y) const;
0328     inline QPointF mapToParent(qreal x, qreal y) const;
0329     inline QPointF mapToScene(qreal x, qreal y) const;
0330     inline QPolygonF mapToItem(const QGraphicsItem *item, qreal x, qreal y, qreal w, qreal h) const;
0331     inline QPolygonF mapToParent(qreal x, qreal y, qreal w, qreal h) const;
0332     inline QPolygonF mapToScene(qreal x, qreal y, qreal w, qreal h) const;
0333     inline QRectF mapRectToItem(const QGraphicsItem *item, qreal x, qreal y, qreal w, qreal h) const;
0334     inline QRectF mapRectToParent(qreal x, qreal y, qreal w, qreal h) const;
0335     inline QRectF mapRectToScene(qreal x, qreal y, qreal w, qreal h) const;
0336     inline QPointF mapFromItem(const QGraphicsItem *item, qreal x, qreal y) const;
0337     inline QPointF mapFromParent(qreal x, qreal y) const;
0338     inline QPointF mapFromScene(qreal x, qreal y) const;
0339     inline QPolygonF mapFromItem(const QGraphicsItem *item, qreal x, qreal y, qreal w, qreal h) const;
0340     inline QPolygonF mapFromParent(qreal x, qreal y, qreal w, qreal h) const;
0341     inline QPolygonF mapFromScene(qreal x, qreal y, qreal w, qreal h) const;
0342     inline QRectF mapRectFromItem(const QGraphicsItem *item, qreal x, qreal y, qreal w, qreal h) const;
0343     inline QRectF mapRectFromParent(qreal x, qreal y, qreal w, qreal h) const;
0344     inline QRectF mapRectFromScene(qreal x, qreal y, qreal w, qreal h) const;
0345 
0346     bool isAncestorOf(const QGraphicsItem *child) const;
0347     QGraphicsItem *commonAncestorItem(const QGraphicsItem *other) const;
0348     bool isUnderMouse() const;
0349 
0350     // Custom data
0351     QVariant data(int key) const;
0352     void setData(int key, const QVariant &value);
0353 
0354     Qt::InputMethodHints inputMethodHints() const;
0355     void setInputMethodHints(Qt::InputMethodHints hints);
0356 
0357     enum {
0358         Type = 1,
0359         UserType = 65536
0360     };
0361     virtual int type() const;
0362 
0363     void installSceneEventFilter(QGraphicsItem *filterItem);
0364     void removeSceneEventFilter(QGraphicsItem *filterItem);
0365 
0366 protected:
0367     void updateMicroFocus();
0368     virtual bool sceneEventFilter(QGraphicsItem *watched, QEvent *event);
0369     virtual bool sceneEvent(QEvent *event);
0370     virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
0371     virtual void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
0372     virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
0373     virtual void dragMoveEvent(QGraphicsSceneDragDropEvent *event);
0374     virtual void dropEvent(QGraphicsSceneDragDropEvent *event);
0375     virtual void focusInEvent(QFocusEvent *event);
0376     virtual void focusOutEvent(QFocusEvent *event);
0377     virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
0378     virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
0379     virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
0380     virtual void keyPressEvent(QKeyEvent *event);
0381     virtual void keyReleaseEvent(QKeyEvent *event);
0382     virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
0383     virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
0384     virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
0385     virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
0386     virtual void wheelEvent(QGraphicsSceneWheelEvent *event);
0387     virtual void inputMethodEvent(QInputMethodEvent *event);
0388     virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
0389 
0390     virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);
0391 
0392     enum Extension {
0393         UserExtension = 0x80000000
0394     };
0395     virtual bool supportsExtension(Extension extension) const;
0396     virtual void setExtension(Extension extension, const QVariant &variant);
0397     virtual QVariant extension(const QVariant &variant) const;
0398 
0399 protected:
0400     QGraphicsItem(QGraphicsItemPrivate &dd, QGraphicsItem *parent);
0401     QScopedPointer<QGraphicsItemPrivate> d_ptr;
0402 
0403     void addToIndex();
0404     void removeFromIndex();
0405     void prepareGeometryChange();
0406 
0407 private:
0408     Q_DISABLE_COPY(QGraphicsItem)
0409     Q_DECLARE_PRIVATE(QGraphicsItem)
0410     friend class QGraphicsItemGroup;
0411     friend class QGraphicsScene;
0412     friend class QGraphicsScenePrivate;
0413     friend class QGraphicsSceneFindItemBspTreeVisitor;
0414     friend class QGraphicsSceneBspTree;
0415     friend class QGraphicsView;
0416     friend class QGraphicsViewPrivate;
0417     friend class QGraphicsObject;
0418     friend class QGraphicsWidget;
0419     friend class QGraphicsWidgetPrivate;
0420     friend class QGraphicsProxyWidgetPrivate;
0421     friend class QGraphicsSceneIndex;
0422     friend class QGraphicsSceneIndexPrivate;
0423     friend class QGraphicsSceneBspTreeIndex;
0424     friend class QGraphicsSceneBspTreeIndexPrivate;
0425     friend class QGraphicsItemEffectSourcePrivate;
0426     friend class QGraphicsTransformPrivate;
0427 #ifndef QT_NO_GESTURES
0428     friend class QGestureManager;
0429 #endif
0430     friend class ::tst_QGraphicsItem;
0431     friend bool qt_closestLeaf(const QGraphicsItem *, const QGraphicsItem *);
0432     friend bool qt_closestItemFirst(const QGraphicsItem *, const QGraphicsItem *);
0433 };
0434 
0435 Q_DECLARE_OPERATORS_FOR_FLAGS(QGraphicsItem::GraphicsItemFlags)
0436 #ifndef Q_QDOC
0437 Q_DECLARE_INTERFACE(QGraphicsItem, "org.qt-project.Qt.QGraphicsItem")
0438 #endif
0439 
0440 inline void QGraphicsItem::setPos(qreal ax, qreal ay)
0441 { setPos(QPointF(ax, ay)); }
0442 inline void QGraphicsItem::ensureVisible(qreal ax, qreal ay, qreal w, qreal h, int xmargin, int ymargin)
0443 { ensureVisible(QRectF(ax, ay, w, h), xmargin, ymargin); }
0444 inline void QGraphicsItem::update(qreal ax, qreal ay, qreal width, qreal height)
0445 { update(QRectF(ax, ay, width, height)); }
0446 inline bool QGraphicsItem::isObscured(qreal ax, qreal ay, qreal w, qreal h) const
0447 { return isObscured(QRectF(ax, ay, w, h)); }
0448 inline QPointF QGraphicsItem::mapToItem(const QGraphicsItem *item, qreal ax, qreal ay) const
0449 { return mapToItem(item, QPointF(ax, ay)); }
0450 inline QPointF QGraphicsItem::mapToParent(qreal ax, qreal ay) const
0451 { return mapToParent(QPointF(ax, ay)); }
0452 inline QPointF QGraphicsItem::mapToScene(qreal ax, qreal ay) const
0453 { return mapToScene(QPointF(ax, ay));  }
0454 inline QPointF QGraphicsItem::mapFromItem(const QGraphicsItem *item, qreal ax, qreal ay) const
0455 { return mapFromItem(item, QPointF(ax, ay)); }
0456 inline QPointF QGraphicsItem::mapFromParent(qreal ax, qreal ay) const
0457 { return mapFromParent(QPointF(ax, ay));  }
0458 inline QPointF QGraphicsItem::mapFromScene(qreal ax, qreal ay) const
0459 { return mapFromScene(QPointF(ax, ay));  }
0460 inline QPolygonF QGraphicsItem::mapToItem(const QGraphicsItem *item, qreal ax, qreal ay, qreal w, qreal h) const
0461 { return mapToItem(item, QRectF(ax, ay, w, h)); }
0462 inline QPolygonF QGraphicsItem::mapToParent(qreal ax, qreal ay, qreal w, qreal h) const
0463 { return mapToParent(QRectF(ax, ay, w, h)); }
0464 inline QPolygonF QGraphicsItem::mapToScene(qreal ax, qreal ay, qreal w, qreal h) const
0465 { return mapToScene(QRectF(ax, ay, w, h)); }
0466 inline QRectF QGraphicsItem::mapRectToItem(const QGraphicsItem *item, qreal ax, qreal ay, qreal w, qreal h) const
0467 { return mapRectToItem(item, QRectF(ax, ay, w, h)); }
0468 inline QRectF QGraphicsItem::mapRectToParent(qreal ax, qreal ay, qreal w, qreal h) const
0469 { return mapRectToParent(QRectF(ax, ay, w, h)); }
0470 inline QRectF QGraphicsItem::mapRectToScene(qreal ax, qreal ay, qreal w, qreal h) const
0471 { return mapRectToScene(QRectF(ax, ay, w, h)); }
0472 inline QPolygonF QGraphicsItem::mapFromItem(const QGraphicsItem *item, qreal ax, qreal ay, qreal w, qreal h) const
0473 { return mapFromItem(item, QRectF(ax, ay, w, h)); }
0474 inline QPolygonF QGraphicsItem::mapFromParent(qreal ax, qreal ay, qreal w, qreal h) const
0475 { return mapFromParent(QRectF(ax, ay, w, h)); }
0476 inline QPolygonF QGraphicsItem::mapFromScene(qreal ax, qreal ay, qreal w, qreal h) const
0477 { return mapFromScene(QRectF(ax, ay, w, h)); }
0478 inline QRectF QGraphicsItem::mapRectFromItem(const QGraphicsItem *item, qreal ax, qreal ay, qreal w, qreal h) const
0479 { return mapRectFromItem(item, QRectF(ax, ay, w, h)); }
0480 inline QRectF QGraphicsItem::mapRectFromParent(qreal ax, qreal ay, qreal w, qreal h) const
0481 { return mapRectFromParent(QRectF(ax, ay, w, h)); }
0482 inline QRectF QGraphicsItem::mapRectFromScene(qreal ax, qreal ay, qreal w, qreal h) const
0483 { return mapRectFromScene(QRectF(ax, ay, w, h)); }
0484 
0485 
0486 class Q_WIDGETS_EXPORT QGraphicsObject : public QObject, public QGraphicsItem
0487 {
0488     Q_OBJECT
0489     Q_PROPERTY(QGraphicsObject* parent READ parentObject WRITE setParentItem NOTIFY parentChanged
0490                DESIGNABLE false)
0491     Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity NOTIFY opacityChanged FINAL)
0492     Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
0493     Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL)
0494     Q_PROPERTY(QPointF pos READ pos WRITE setPos FINAL)
0495     Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged FINAL)
0496     Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged FINAL)
0497     Q_PROPERTY(qreal z READ zValue WRITE setZValue NOTIFY zChanged FINAL)
0498     Q_PROPERTY(qreal rotation READ rotation WRITE setRotation NOTIFY rotationChanged)
0499     Q_PROPERTY(qreal scale READ scale WRITE setScale NOTIFY scaleChanged)
0500     Q_PROPERTY(QPointF transformOriginPoint READ transformOriginPoint WRITE setTransformOriginPoint)
0501 #if QT_CONFIG(graphicseffect)
0502     Q_PROPERTY(QGraphicsEffect *effect READ graphicsEffect WRITE setGraphicsEffect)
0503 #endif
0504     Q_PRIVATE_PROPERTY(QGraphicsItem::d_func(), qreal width READ width WRITE setWidth
0505                        NOTIFY widthChanged RESET resetWidth FINAL)
0506     Q_PRIVATE_PROPERTY(QGraphicsItem::d_func(), qreal height READ height WRITE setHeight
0507                        NOTIFY heightChanged RESET resetHeight FINAL)
0508     Q_INTERFACES(QGraphicsItem)
0509 public:
0510     explicit QGraphicsObject(QGraphicsItem *parent = nullptr);
0511     ~QGraphicsObject();
0512 
0513     using QObject::children;
0514 
0515 #ifndef QT_NO_GESTURES
0516     void grabGesture(Qt::GestureType type, Qt::GestureFlags flags = Qt::GestureFlags());
0517     void ungrabGesture(Qt::GestureType type);
0518 #endif
0519 
0520 protected Q_SLOTS:
0521     void updateMicroFocus();
0522 
0523 Q_SIGNALS:
0524     void parentChanged();
0525     void opacityChanged();
0526     void visibleChanged();
0527     void enabledChanged();
0528     void xChanged();
0529     void yChanged();
0530     void zChanged();
0531     void rotationChanged();
0532     void scaleChanged();
0533     void childrenChanged();
0534     void widthChanged();
0535     void heightChanged();
0536 
0537 protected:
0538     QGraphicsObject(QGraphicsItemPrivate &dd, QGraphicsItem *parent);
0539 
0540     bool event(QEvent *ev) override;
0541 
0542 private:
0543     friend class QGraphicsItem;
0544     friend class QGraphicsItemPrivate;
0545 };
0546 
0547 
0548 class QAbstractGraphicsShapeItemPrivate;
0549 class Q_WIDGETS_EXPORT QAbstractGraphicsShapeItem : public QGraphicsItem
0550 {
0551 public:
0552     explicit QAbstractGraphicsShapeItem(QGraphicsItem *parent = nullptr);
0553     ~QAbstractGraphicsShapeItem();
0554 
0555     QPen pen() const;
0556     void setPen(const QPen &pen);
0557 
0558     QBrush brush() const;
0559     void setBrush(const QBrush &brush);
0560 
0561     bool isObscuredBy(const QGraphicsItem *item) const override;
0562     QPainterPath opaqueArea() const override;
0563 
0564 protected:
0565     QAbstractGraphicsShapeItem(QAbstractGraphicsShapeItemPrivate &dd,
0566                                QGraphicsItem *parent);
0567 
0568 private:
0569     Q_DISABLE_COPY(QAbstractGraphicsShapeItem)
0570     Q_DECLARE_PRIVATE(QAbstractGraphicsShapeItem)
0571 };
0572 
0573 class QGraphicsPathItemPrivate;
0574 class Q_WIDGETS_EXPORT QGraphicsPathItem : public QAbstractGraphicsShapeItem
0575 {
0576 public:
0577     explicit QGraphicsPathItem(QGraphicsItem *parent = nullptr);
0578     explicit QGraphicsPathItem(const QPainterPath &path, QGraphicsItem *parent = nullptr);
0579     ~QGraphicsPathItem();
0580 
0581     QPainterPath path() const;
0582     void setPath(const QPainterPath &path);
0583 
0584     QRectF boundingRect() const override;
0585     QPainterPath shape() const override;
0586     bool contains(const QPointF &point) const override;
0587 
0588     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
0589 
0590     bool isObscuredBy(const QGraphicsItem *item) const override;
0591     QPainterPath opaqueArea() const override;
0592 
0593     enum { Type = 2 };
0594     int type() const override;
0595 
0596 protected:
0597     bool supportsExtension(Extension extension) const override;
0598     void setExtension(Extension extension, const QVariant &variant) override;
0599     QVariant extension(const QVariant &variant) const override;
0600 
0601 private:
0602     Q_DISABLE_COPY(QGraphicsPathItem)
0603     Q_DECLARE_PRIVATE(QGraphicsPathItem)
0604 };
0605 
0606 class QGraphicsRectItemPrivate;
0607 class Q_WIDGETS_EXPORT QGraphicsRectItem : public QAbstractGraphicsShapeItem
0608 {
0609 public:
0610     explicit QGraphicsRectItem(QGraphicsItem *parent = nullptr);
0611     explicit QGraphicsRectItem(const QRectF &rect, QGraphicsItem *parent = nullptr);
0612     explicit QGraphicsRectItem(qreal x, qreal y, qreal w, qreal h, QGraphicsItem *parent = nullptr);
0613     ~QGraphicsRectItem();
0614 
0615     QRectF rect() const;
0616     void setRect(const QRectF &rect);
0617     inline void setRect(qreal x, qreal y, qreal w, qreal h);
0618 
0619     QRectF boundingRect() const override;
0620     QPainterPath shape() const override;
0621     bool contains(const QPointF &point) const override;
0622 
0623     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
0624 
0625     bool isObscuredBy(const QGraphicsItem *item) const override;
0626     QPainterPath opaqueArea() const override;
0627 
0628     enum { Type = 3 };
0629     int type() const override;
0630 
0631 protected:
0632     bool supportsExtension(Extension extension) const override;
0633     void setExtension(Extension extension, const QVariant &variant) override;
0634     QVariant extension(const QVariant &variant) const override;
0635 
0636 private:
0637     Q_DISABLE_COPY(QGraphicsRectItem)
0638     Q_DECLARE_PRIVATE(QGraphicsRectItem)
0639 };
0640 
0641 inline void QGraphicsRectItem::setRect(qreal ax, qreal ay, qreal w, qreal h)
0642 { setRect(QRectF(ax, ay, w, h)); }
0643 
0644 class QGraphicsEllipseItemPrivate;
0645 class Q_WIDGETS_EXPORT QGraphicsEllipseItem : public QAbstractGraphicsShapeItem
0646 {
0647 public:
0648     explicit QGraphicsEllipseItem(QGraphicsItem *parent = nullptr);
0649     explicit QGraphicsEllipseItem(const QRectF &rect, QGraphicsItem *parent = nullptr);
0650     explicit QGraphicsEllipseItem(qreal x, qreal y, qreal w, qreal h, QGraphicsItem *parent = nullptr);
0651     ~QGraphicsEllipseItem();
0652 
0653     QRectF rect() const;
0654     void setRect(const QRectF &rect);
0655     inline void setRect(qreal x, qreal y, qreal w, qreal h);
0656 
0657     int startAngle() const;
0658     void setStartAngle(int angle);
0659 
0660     int spanAngle() const;
0661     void setSpanAngle(int angle);
0662 
0663     QRectF boundingRect() const override;
0664     QPainterPath shape() const override;
0665     bool contains(const QPointF &point) const override;
0666 
0667     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
0668 
0669     bool isObscuredBy(const QGraphicsItem *item) const override;
0670     QPainterPath opaqueArea() const override;
0671 
0672     enum { Type = 4 };
0673     int type() const override;
0674 
0675 protected:
0676     bool supportsExtension(Extension extension) const override;
0677     void setExtension(Extension extension, const QVariant &variant) override;
0678     QVariant extension(const QVariant &variant) const override;
0679 
0680 private:
0681     Q_DISABLE_COPY(QGraphicsEllipseItem)
0682     Q_DECLARE_PRIVATE(QGraphicsEllipseItem)
0683 };
0684 
0685 inline void QGraphicsEllipseItem::setRect(qreal ax, qreal ay, qreal w, qreal h)
0686 { setRect(QRectF(ax, ay, w, h)); }
0687 
0688 class QGraphicsPolygonItemPrivate;
0689 class Q_WIDGETS_EXPORT QGraphicsPolygonItem : public QAbstractGraphicsShapeItem
0690 {
0691 public:
0692     explicit QGraphicsPolygonItem(QGraphicsItem *parent = nullptr);
0693     explicit QGraphicsPolygonItem(const QPolygonF &polygon,
0694                                   QGraphicsItem *parent = nullptr);
0695     ~QGraphicsPolygonItem();
0696 
0697     QPolygonF polygon() const;
0698     void setPolygon(const QPolygonF &polygon);
0699 
0700     Qt::FillRule fillRule() const;
0701     void setFillRule(Qt::FillRule rule);
0702 
0703     QRectF boundingRect() const override;
0704     QPainterPath shape() const override;
0705     bool contains(const QPointF &point) const override;
0706 
0707     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
0708 
0709     bool isObscuredBy(const QGraphicsItem *item) const override;
0710     QPainterPath opaqueArea() const override;
0711 
0712     enum { Type = 5 };
0713     int type() const override;
0714 
0715 protected:
0716     bool supportsExtension(Extension extension) const override;
0717     void setExtension(Extension extension, const QVariant &variant) override;
0718     QVariant extension(const QVariant &variant) const override;
0719 
0720 private:
0721     Q_DISABLE_COPY(QGraphicsPolygonItem)
0722     Q_DECLARE_PRIVATE(QGraphicsPolygonItem)
0723 };
0724 
0725 class QGraphicsLineItemPrivate;
0726 class Q_WIDGETS_EXPORT QGraphicsLineItem : public QGraphicsItem
0727 {
0728 public:
0729     explicit QGraphicsLineItem(QGraphicsItem *parent = nullptr);
0730     explicit QGraphicsLineItem(const QLineF &line, QGraphicsItem *parent = nullptr);
0731     explicit QGraphicsLineItem(qreal x1, qreal y1, qreal x2, qreal y2, QGraphicsItem *parent = nullptr);
0732     ~QGraphicsLineItem();
0733 
0734     QPen pen() const;
0735     void setPen(const QPen &pen);
0736 
0737     QLineF line() const;
0738     void setLine(const QLineF &line);
0739     inline void setLine(qreal x1, qreal y1, qreal x2, qreal y2)
0740     { setLine(QLineF(x1, y1, x2, y2)); }
0741 
0742     QRectF boundingRect() const override;
0743     QPainterPath shape() const override;
0744     bool contains(const QPointF &point) const override;
0745 
0746     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
0747 
0748     bool isObscuredBy(const QGraphicsItem *item) const override;
0749     QPainterPath opaqueArea() const override;
0750 
0751     enum { Type = 6 };
0752     int type() const override;
0753 
0754 protected:
0755     bool supportsExtension(Extension extension) const override;
0756     void setExtension(Extension extension, const QVariant &variant) override;
0757     QVariant extension(const QVariant &variant) const override;
0758 
0759 private:
0760     Q_DISABLE_COPY(QGraphicsLineItem)
0761     Q_DECLARE_PRIVATE(QGraphicsLineItem)
0762 };
0763 
0764 class QGraphicsPixmapItemPrivate;
0765 class Q_WIDGETS_EXPORT QGraphicsPixmapItem : public QGraphicsItem
0766 {
0767 public:
0768     enum ShapeMode {
0769         MaskShape,
0770         BoundingRectShape,
0771         HeuristicMaskShape
0772     };
0773 
0774     explicit QGraphicsPixmapItem(QGraphicsItem *parent = nullptr);
0775     explicit QGraphicsPixmapItem(const QPixmap &pixmap, QGraphicsItem *parent = nullptr);
0776     ~QGraphicsPixmapItem();
0777 
0778     QPixmap pixmap() const;
0779     void setPixmap(const QPixmap &pixmap);
0780 
0781     Qt::TransformationMode transformationMode() const;
0782     void setTransformationMode(Qt::TransformationMode mode);
0783 
0784     QPointF offset() const;
0785     void setOffset(const QPointF &offset);
0786     inline void setOffset(qreal x, qreal y);
0787 
0788     QRectF boundingRect() const override;
0789     QPainterPath shape() const override;
0790     bool contains(const QPointF &point) const override;
0791 
0792     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
0793 
0794     bool isObscuredBy(const QGraphicsItem *item) const override;
0795     QPainterPath opaqueArea() const override;
0796 
0797     enum { Type = 7 };
0798     int type() const override;
0799 
0800     ShapeMode shapeMode() const;
0801     void setShapeMode(ShapeMode mode);
0802 
0803 protected:
0804     bool supportsExtension(Extension extension) const override;
0805     void setExtension(Extension extension, const QVariant &variant) override;
0806     QVariant extension(const QVariant &variant) const override;
0807 
0808 private:
0809     Q_DISABLE_COPY(QGraphicsPixmapItem)
0810     Q_DECLARE_PRIVATE(QGraphicsPixmapItem)
0811 };
0812 
0813 inline void QGraphicsPixmapItem::setOffset(qreal ax, qreal ay)
0814 { setOffset(QPointF(ax, ay)); }
0815 
0816 class QGraphicsTextItemPrivate;
0817 class QTextDocument;
0818 class QTextCursor;
0819 class Q_WIDGETS_EXPORT QGraphicsTextItem : public QGraphicsObject
0820 {
0821     Q_OBJECT
0822     QDOC_PROPERTY(bool openExternalLinks READ openExternalLinks WRITE setOpenExternalLinks)
0823     QDOC_PROPERTY(QTextCursor textCursor READ textCursor WRITE setTextCursor)
0824 
0825 public:
0826     explicit QGraphicsTextItem(QGraphicsItem *parent = nullptr);
0827     explicit QGraphicsTextItem(const QString &text, QGraphicsItem *parent = nullptr);
0828     ~QGraphicsTextItem();
0829 
0830     QString toHtml() const;
0831     void setHtml(const QString &html);
0832 
0833     QString toPlainText() const;
0834     void setPlainText(const QString &text);
0835 
0836     QFont font() const;
0837     void setFont(const QFont &font);
0838 
0839     void setDefaultTextColor(const QColor &c);
0840     QColor defaultTextColor() const;
0841 
0842     QRectF boundingRect() const override;
0843     QPainterPath shape() const override;
0844     bool contains(const QPointF &point) const override;
0845 
0846     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
0847 
0848     bool isObscuredBy(const QGraphicsItem *item) const override;
0849     QPainterPath opaqueArea() const override;
0850 
0851     enum { Type = 8 };
0852     int type() const override;
0853 
0854     void setTextWidth(qreal width);
0855     qreal textWidth() const;
0856 
0857     void adjustSize();
0858 
0859     void setDocument(QTextDocument *document);
0860     QTextDocument *document() const;
0861 
0862     void setTextInteractionFlags(Qt::TextInteractionFlags flags);
0863     Qt::TextInteractionFlags textInteractionFlags() const;
0864 
0865     void setTabChangesFocus(bool b);
0866     bool tabChangesFocus() const;
0867 
0868     void setOpenExternalLinks(bool open);
0869     bool openExternalLinks() const;
0870 
0871     void setTextCursor(const QTextCursor &cursor);
0872     QTextCursor textCursor() const;
0873 
0874 Q_SIGNALS:
0875     void linkActivated(const QString &);
0876     void linkHovered(const QString &);
0877 
0878 protected:
0879     bool sceneEvent(QEvent *event) override;
0880     void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
0881     void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
0882     void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
0883     void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override;
0884     void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override;
0885     void keyPressEvent(QKeyEvent *event) override;
0886     void keyReleaseEvent(QKeyEvent *event) override;
0887     void focusInEvent(QFocusEvent *event) override;
0888     void focusOutEvent(QFocusEvent *event) override;
0889     void dragEnterEvent(QGraphicsSceneDragDropEvent *event) override;
0890     void dragLeaveEvent(QGraphicsSceneDragDropEvent *event) override;
0891     void dragMoveEvent(QGraphicsSceneDragDropEvent *event) override;
0892     void dropEvent(QGraphicsSceneDragDropEvent *event) override;
0893     void inputMethodEvent(QInputMethodEvent *event) override;
0894     void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override;
0895     void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override;
0896     void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override;
0897 
0898     QVariant inputMethodQuery(Qt::InputMethodQuery query) const override;
0899 
0900     bool supportsExtension(Extension extension) const override;
0901     void setExtension(Extension extension, const QVariant &variant) override;
0902     QVariant extension(const QVariant &variant) const override;
0903 
0904 private:
0905     Q_DISABLE_COPY(QGraphicsTextItem)
0906     QGraphicsTextItemPrivate *dd;
0907     friend class QGraphicsTextItemPrivate;
0908 };
0909 
0910 class QGraphicsSimpleTextItemPrivate;
0911 class Q_WIDGETS_EXPORT QGraphicsSimpleTextItem : public QAbstractGraphicsShapeItem
0912 {
0913 public:
0914     explicit QGraphicsSimpleTextItem(QGraphicsItem *parent = nullptr);
0915     explicit QGraphicsSimpleTextItem(const QString &text, QGraphicsItem *parent = nullptr);
0916     ~QGraphicsSimpleTextItem();
0917 
0918     void setText(const QString &text);
0919     QString text() const;
0920 
0921     void setFont(const QFont &font);
0922     QFont font() const;
0923 
0924     QRectF boundingRect() const override;
0925     QPainterPath shape() const override;
0926     bool contains(const QPointF &point) const override;
0927 
0928     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
0929 
0930     bool isObscuredBy(const QGraphicsItem *item) const override;
0931     QPainterPath opaqueArea() const override;
0932 
0933     enum { Type = 9 };
0934     int type() const override;
0935 
0936 protected:
0937     bool supportsExtension(Extension extension) const override;
0938     void setExtension(Extension extension, const QVariant &variant) override;
0939     QVariant extension(const QVariant &variant) const override;
0940 
0941 private:
0942     Q_DISABLE_COPY(QGraphicsSimpleTextItem)
0943     Q_DECLARE_PRIVATE(QGraphicsSimpleTextItem)
0944 };
0945 
0946 class QGraphicsItemGroupPrivate;
0947 class Q_WIDGETS_EXPORT QGraphicsItemGroup : public QGraphicsItem
0948 {
0949 public:
0950     explicit QGraphicsItemGroup(QGraphicsItem *parent = nullptr);
0951     ~QGraphicsItemGroup();
0952 
0953     void addToGroup(QGraphicsItem *item);
0954     void removeFromGroup(QGraphicsItem *item);
0955 
0956     QRectF boundingRect() const override;
0957     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
0958 
0959     bool isObscuredBy(const QGraphicsItem *item) const override;
0960     QPainterPath opaqueArea() const override;
0961 
0962     enum { Type = 10 };
0963     int type() const override;
0964 
0965 private:
0966     Q_DISABLE_COPY(QGraphicsItemGroup)
0967     Q_DECLARE_PRIVATE(QGraphicsItemGroup)
0968 };
0969 
0970 template <class T> inline T qgraphicsitem_cast(QGraphicsItem *item)
0971 {
0972     typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type Item;
0973     constexpr int ItemType = int(Item::Type);
0974     if constexpr (int(Item::Type) == int(QGraphicsItem::Type))
0975         return static_cast<T>(item);
0976     else
0977         return (item && ItemType == item->type()) ? static_cast<T>(item) : nullptr;
0978 }
0979 
0980 template <class T> inline T qgraphicsitem_cast(const QGraphicsItem *item)
0981 {
0982     typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type Item;
0983     constexpr int ItemType = int(Item::Type);
0984     if constexpr (ItemType == int(QGraphicsItem::Type))
0985         return static_cast<T>(item);
0986     else
0987         return (item && ItemType == item->type()) ? static_cast<T>(item) : nullptr;
0988 }
0989 
0990 template <>
0991 inline QGraphicsItem *qgraphicsitem_cast<QGraphicsItem *>(QGraphicsItem *item)
0992 {
0993     return item;
0994 }
0995 
0996 template <>
0997 inline const QGraphicsItem *qgraphicsitem_cast<const QGraphicsItem *>(const QGraphicsItem *item)
0998 {
0999     return item;
1000 }
1001 
1002 #ifndef QT_NO_DEBUG_STREAM
1003 Q_WIDGETS_EXPORT QDebug operator<<(QDebug debug, const QGraphicsItem *item);
1004 Q_WIDGETS_EXPORT QDebug operator<<(QDebug debug, const QGraphicsObject *item);
1005 Q_WIDGETS_EXPORT QDebug operator<<(QDebug debug, QGraphicsItem::GraphicsItemChange change);
1006 Q_WIDGETS_EXPORT QDebug operator<<(QDebug debug, QGraphicsItem::GraphicsItemFlag flag);
1007 Q_WIDGETS_EXPORT QDebug operator<<(QDebug debug, QGraphicsItem::GraphicsItemFlags flags);
1008 #endif
1009 
1010 QT_END_NAMESPACE
1011 
1012 QT_DECL_METATYPE_EXTERN_TAGGED(QGraphicsItem*, QGraphicsItem_ptr, Q_WIDGETS_EXPORT)
1013 
1014 #endif // QGRAPHICSITEM_H