qgraphicsscene.h

Go to the documentation of this file.
00001 /****************************************************************************
00002 **
00003 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
00004 ** All rights reserved.
00005 ** Contact: Nokia Corporation (qt-info@nokia.com)
00006 **
00007 ** This file is part of the QtGui module of the Qt Toolkit.
00008 **
00009 ** $QT_BEGIN_LICENSE:LGPL$
00010 ** Commercial Usage
00011 ** Licensees holding valid Qt Commercial licenses may use this file in
00012 ** accordance with the Qt Commercial License Agreement provided with the
00013 ** Software or, alternatively, in accordance with the terms contained in
00014 ** a written agreement between you and Nokia.
00015 **
00016 ** GNU Lesser General Public License Usage
00017 ** Alternatively, this file may be used under the terms of the GNU Lesser
00018 ** General Public License version 2.1 as published by the Free Software
00019 ** Foundation and appearing in the file LICENSE.LGPL included in the
00020 ** packaging of this file.  Please review the following information to
00021 ** ensure the GNU Lesser General Public License version 2.1 requirements
00022 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
00023 **
00024 ** In addition, as a special exception, Nokia gives you certain additional
00025 ** rights.  These rights are described in the Nokia Qt LGPL Exception
00026 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this module.
00027 **
00028 ** GNU General Public License Usage
00029 ** Alternatively, this file may be used under the terms of the GNU
00030 ** General Public License version 3.0 as published by the Free Software
00031 ** Foundation and appearing in the file LICENSE.GPL included in the
00032 ** packaging of this file.  Please review the following information to
00033 ** ensure the GNU General Public License version 3.0 requirements will be
00034 ** met: http://www.gnu.org/copyleft/gpl.html.
00035 **
00036 ** If you have questions regarding the use of this file, please contact
00037 ** Nokia at qt-info@nokia.com.
00038 ** $QT_END_LICENSE$
00039 **
00040 ****************************************************************************/
00041 
00042 #ifndef QGRAPHICSSCENE_H
00043 #define QGRAPHICSSCENE_H
00044 
00045 #include <QtCore/qobject.h>
00046 #include <QtCore/qpoint.h>
00047 #include <QtCore/qrect.h>
00048 #include <QtGui/qbrush.h>
00049 #include <QtGui/qfont.h>
00050 #include <QtGui/qtransform.h>
00051 #include <QtGui/qmatrix.h>
00052 #include <QtGui/qpen.h>
00053 
00054 QT_BEGIN_HEADER
00055 
00056 QT_BEGIN_NAMESPACE
00057 
00058 QT_MODULE(Gui)
00059 
00060 #if !defined(QT_NO_GRAPHICSVIEW) || (QT_EDITION & QT_MODULE_GRAPHICSVIEW) != QT_MODULE_GRAPHICSVIEW
00061 
00062 template<typename T> class QList;
00063 class QFocusEvent;
00064 class QFont;
00065 class QFontMetrics;
00066 class QGraphicsEllipseItem;
00067 class QGraphicsItem;
00068 class QGraphicsItemGroup;
00069 class QGraphicsLineItem;
00070 class QGraphicsPathItem;
00071 class QGraphicsPixmapItem;
00072 class QGraphicsPolygonItem;
00073 class QGraphicsProxyWidget;
00074 class QGraphicsRectItem;
00075 class QGraphicsSceneContextMenuEvent;
00076 class QGraphicsSceneDragDropEvent;
00077 class QGraphicsSceneEvent;
00078 class QGraphicsSceneHelpEvent;
00079 class QGraphicsSceneHoverEvent;
00080 class QGraphicsSceneMouseEvent;
00081 class QGraphicsSceneWheelEvent;
00082 class QGraphicsSimpleTextItem;
00083 class QGraphicsTextItem;
00084 class QGraphicsView;
00085 class QGraphicsWidget;
00086 class QGraphicsSceneIndex;
00087 class QHelpEvent;
00088 class QInputMethodEvent;
00089 class QKeyEvent;
00090 class QLineF;
00091 class QPainterPath;
00092 class QPixmap;
00093 class QPointF;
00094 class QPolygonF;
00095 class QRectF;
00096 class QSizeF;
00097 class QStyle;
00098 class QStyleOptionGraphicsItem;
00099 
00100 class QGraphicsScenePrivate;
00101 class Q_GUI_EXPORT QGraphicsScene : public QObject
00102 {
00103     Q_OBJECT
00104     Q_PROPERTY(QBrush backgroundBrush READ backgroundBrush WRITE setBackgroundBrush)
00105     Q_PROPERTY(QBrush foregroundBrush READ foregroundBrush WRITE setForegroundBrush)
00106     Q_PROPERTY(ItemIndexMethod itemIndexMethod READ itemIndexMethod WRITE setItemIndexMethod)
00107     Q_PROPERTY(QRectF sceneRect READ sceneRect WRITE setSceneRect)
00108     Q_PROPERTY(int bspTreeDepth READ bspTreeDepth WRITE setBspTreeDepth)
00109     Q_PROPERTY(QPalette palette READ palette WRITE setPalette)
00110     Q_PROPERTY(QFont font READ font WRITE setFont)
00111     Q_PROPERTY(bool sortCacheEnabled READ isSortCacheEnabled WRITE setSortCacheEnabled)
00112     Q_PROPERTY(bool stickyFocus READ stickyFocus WRITE setStickyFocus)
00113 
00114 public:
00115     enum ItemIndexMethod {
00116         BspTreeIndex,
00117         NoIndex = -1
00118     };
00119 
00120     enum SceneLayer {
00121         ItemLayer = 0x1,
00122         BackgroundLayer = 0x2,
00123         ForegroundLayer = 0x4,
00124         AllLayers = 0xffff
00125     };
00126     Q_DECLARE_FLAGS(SceneLayers, SceneLayer)
00127 
00128     QGraphicsScene(QObject *parent = 0);
00129     QGraphicsScene(const QRectF &sceneRect, QObject *parent = 0);
00130     QGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *parent = 0);
00131     virtual ~QGraphicsScene();
00132 
00133     QRectF sceneRect() const;
00134     inline qreal width() const { return sceneRect().width(); }
00135     inline qreal height() const { return sceneRect().height(); }
00136     void setSceneRect(const QRectF &rect);
00137     inline void setSceneRect(qreal x, qreal y, qreal w, qreal h)
00138     { setSceneRect(QRectF(x, y, w, h)); }
00139 
00140     void render(QPainter *painter,
00141                 const QRectF &target = QRectF(), const QRectF &source = QRectF(),
00142                 Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio);
00143 
00144     ItemIndexMethod itemIndexMethod() const;
00145     void setItemIndexMethod(ItemIndexMethod method);
00146 
00147     bool isSortCacheEnabled() const;
00148     void setSortCacheEnabled(bool enabled);
00149 
00150     int bspTreeDepth() const;
00151     void setBspTreeDepth(int depth);
00152 
00153     QRectF itemsBoundingRect() const;
00154 
00155     QList<QGraphicsItem *> items() const;
00156     QList<QGraphicsItem *> items(Qt::SortOrder order) const; // ### Qt 5: unify
00157 
00158     QList<QGraphicsItem *> items(const QPointF &pos, Qt::ItemSelectionMode mode, Qt::SortOrder order, const QTransform &deviceTransform = QTransform()) const;
00159     QList<QGraphicsItem *> items(const QRectF &rect, Qt::ItemSelectionMode mode, Qt::SortOrder order, const QTransform &deviceTransform = QTransform()) const;
00160     QList<QGraphicsItem *> items(const QPolygonF &polygon, Qt::ItemSelectionMode mode, Qt::SortOrder order, const QTransform &deviceTransform = QTransform()) const;
00161     QList<QGraphicsItem *> items(const QPainterPath &path, Qt::ItemSelectionMode mode, Qt::SortOrder order, const QTransform &deviceTransform = QTransform()) const;
00162 
00163     QList<QGraphicsItem *> items(const QPointF &pos) const; // ### obsolete
00164     QList<QGraphicsItem *> items(const QRectF &rect, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const; // ### obsolete
00165     QList<QGraphicsItem *> items(const QPolygonF &polygon, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const; // ### obsolete
00166     QList<QGraphicsItem *> items(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const; // ### obsolete
00167 
00168     QList<QGraphicsItem *> collidingItems(const QGraphicsItem *item, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const;
00169 
00170     QGraphicsItem *itemAt(const QPointF &pos) const; // ### obsolete
00171     QGraphicsItem *itemAt(const QPointF &pos, const QTransform &deviceTransform) const;
00172 
00173     inline QList<QGraphicsItem *> items(qreal x, qreal y, qreal w, qreal h, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
00174     { return items(QRectF(x, y, w, h), mode); } // ### obsolete
00175     inline QList<QGraphicsItem *> items(qreal x, qreal y, qreal w, qreal h, Qt::ItemSelectionMode mode, Qt::SortOrder order,
00176                                         const QTransform &deviceTransform = QTransform()) const
00177     { return items(QRectF(x, y, w, h), mode, order, deviceTransform); }
00178     inline QGraphicsItem *itemAt(qreal x, qreal y) const // ### obsolete
00179     { return itemAt(QPointF(x, y)); }
00180     inline QGraphicsItem *itemAt(qreal x, qreal y, const QTransform &deviceTransform) const
00181     { return itemAt(QPointF(x, y), deviceTransform); }
00182 
00183     QList<QGraphicsItem *> selectedItems() const;
00184     QPainterPath selectionArea() const;
00185     void setSelectionArea(const QPainterPath &path); // ### obsolete
00186     void setSelectionArea(const QPainterPath &path, const QTransform &deviceTransform);
00187     void setSelectionArea(const QPainterPath &path, Qt::ItemSelectionMode mode); // ### obsolete
00188     void setSelectionArea(const QPainterPath &path, Qt::ItemSelectionMode mode, const QTransform &deviceTransform);
00189 
00190     QGraphicsItemGroup *createItemGroup(const QList<QGraphicsItem *> &items);
00191     void destroyItemGroup(QGraphicsItemGroup *group);
00192 
00193     void addItem(QGraphicsItem *item);
00194     QGraphicsEllipseItem *addEllipse(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush());
00195     QGraphicsLineItem *addLine(const QLineF &line, const QPen &pen = QPen());
00196     QGraphicsPathItem *addPath(const QPainterPath &path, const QPen &pen = QPen(), const QBrush &brush = QBrush());
00197     QGraphicsPixmapItem *addPixmap(const QPixmap &pixmap);
00198     QGraphicsPolygonItem *addPolygon(const QPolygonF &polygon, const QPen &pen = QPen(), const QBrush &brush = QBrush());
00199     QGraphicsRectItem *addRect(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush());
00200     QGraphicsTextItem *addText(const QString &text, const QFont &font = QFont());
00201     QGraphicsSimpleTextItem *addSimpleText(const QString &text, const QFont &font = QFont());
00202     QGraphicsProxyWidget *addWidget(QWidget *widget, Qt::WindowFlags wFlags = 0);
00203     inline QGraphicsEllipseItem *addEllipse(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())
00204     { return addEllipse(QRectF(x, y, w, h), pen, brush); }
00205     inline QGraphicsLineItem *addLine(qreal x1, qreal y1, qreal x2, qreal y2, const QPen &pen = QPen())
00206     { return addLine(QLineF(x1, y1, x2, y2), pen); }
00207     inline QGraphicsRectItem *addRect(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())
00208     { return addRect(QRectF(x, y, w, h), pen, brush); }
00209     void removeItem(QGraphicsItem *item);
00210 
00211     QGraphicsItem *focusItem() const;
00212     void setFocusItem(QGraphicsItem *item, Qt::FocusReason focusReason = Qt::OtherFocusReason);
00213     bool hasFocus() const;
00214     void setFocus(Qt::FocusReason focusReason = Qt::OtherFocusReason);
00215     void clearFocus();
00216 
00217     void setStickyFocus(bool enabled);
00218     bool stickyFocus() const;
00219 
00220     QGraphicsItem *mouseGrabberItem() const;
00221 
00222     QBrush backgroundBrush() const;
00223     void setBackgroundBrush(const QBrush &brush);
00224 
00225     QBrush foregroundBrush() const;
00226     void setForegroundBrush(const QBrush &brush);
00227 
00228     virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
00229 
00230     QList <QGraphicsView *> views() const;
00231 
00232     inline void update(qreal x, qreal y, qreal w, qreal h)
00233     { update(QRectF(x, y, w, h)); }
00234     inline void invalidate(qreal x, qreal y, qreal w, qreal h, SceneLayers layers = AllLayers)
00235     { invalidate(QRectF(x, y, w, h), layers); }
00236 
00237     QStyle *style() const;
00238     void setStyle(QStyle *style);
00239 
00240     QFont font() const;
00241     void setFont(const QFont &font);
00242 
00243     QPalette palette() const;
00244     void setPalette(const QPalette &palette);
00245 
00246     bool isActive() const;
00247     QGraphicsItem *activePanel() const;
00248     void setActivePanel(QGraphicsItem *item);
00249     QGraphicsWidget *activeWindow() const;
00250     void setActiveWindow(QGraphicsWidget *widget);
00251 
00252     bool sendEvent(QGraphicsItem *item, QEvent *event);
00253 
00254 public Q_SLOTS:
00255     void update(const QRectF &rect = QRectF());
00256     void invalidate(const QRectF &rect = QRectF(), SceneLayers layers = AllLayers);
00257     void advance();
00258     void clearSelection();
00259     void clear();
00260 
00261 protected:
00262     bool event(QEvent *event);
00263     bool eventFilter(QObject *watched, QEvent *event);
00264     virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
00265     virtual void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
00266     virtual void dragMoveEvent(QGraphicsSceneDragDropEvent *event);
00267     virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
00268     virtual void dropEvent(QGraphicsSceneDragDropEvent *event);
00269     virtual void focusInEvent(QFocusEvent *event);
00270     virtual void focusOutEvent(QFocusEvent *event);
00271     virtual void helpEvent(QGraphicsSceneHelpEvent *event);
00272     virtual void keyPressEvent(QKeyEvent *event);
00273     virtual void keyReleaseEvent(QKeyEvent *event);
00274     virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
00275     virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
00276     virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
00277     virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
00278     virtual void wheelEvent(QGraphicsSceneWheelEvent *event);
00279     virtual void inputMethodEvent(QInputMethodEvent *event);
00280 
00281     virtual void drawBackground(QPainter *painter, const QRectF &rect);
00282     virtual void drawForeground(QPainter *painter, const QRectF &rect);
00283     virtual void drawItems(QPainter *painter, int numItems,
00284                            QGraphicsItem *items[],
00285                            const QStyleOptionGraphicsItem options[],
00286                            QWidget *widget = 0);
00287 
00288 protected Q_SLOTS:
00289     bool focusNextPrevChild(bool next);
00290 
00291 Q_SIGNALS:
00292     void changed(const QList<QRectF> &region);
00293     void sceneRectChanged(const QRectF &rect);
00294     void selectionChanged();
00295 
00296 private:
00297     Q_DECLARE_PRIVATE(QGraphicsScene)
00298     Q_DISABLE_COPY(QGraphicsScene)
00299     Q_PRIVATE_SLOT(d_func(), void _q_emitUpdated())
00300     Q_PRIVATE_SLOT(d_func(), void _q_polishItems())
00301     Q_PRIVATE_SLOT(d_func(), void _q_processDirtyItems())
00302     Q_PRIVATE_SLOT(d_func(), void _q_updateScenePosDescendants())
00303     friend class QGraphicsItem;
00304     friend class QGraphicsItemPrivate;
00305     friend class QGraphicsObject;
00306     friend class QGraphicsView;
00307     friend class QGraphicsViewPrivate;
00308     friend class QGraphicsWidget;
00309     friend class QGraphicsWidgetPrivate;
00310     friend class QGraphicsEffect;
00311     friend class QGraphicsSceneIndex;
00312     friend class QGraphicsSceneIndexPrivate;
00313     friend class QGraphicsSceneBspTreeIndex;
00314     friend class QGraphicsSceneBspTreeIndexPrivate;
00315     friend class QGraphicsItemEffectSourcePrivate;
00316 #ifndef QT_NO_GESTURES
00317     friend class QGesture;
00318 #endif
00319 };
00320 
00321 Q_DECLARE_OPERATORS_FOR_FLAGS(QGraphicsScene::SceneLayers)
00322 
00323 #endif // QT_NO_GRAPHICSVIEW
00324 
00325 QT_END_NAMESPACE
00326 
00327 QT_END_HEADER
00328 
00329 #endif