QGraphicsScene Class

QGraphicsScene 类为管理大量二维图形项目提供了一个界面。更多

Header: #include <QGraphicsScene>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承: QObject

公共类型

enum ItemIndexMethod { BspTreeIndex, NoIndex }
enum SceneLayer { ItemLayer, BackgroundLayer, ForegroundLayer, AllLayers }
flags SceneLayers

属性

公共功能

QGraphicsScene(QObject *parent = nullptr)
QGraphicsScene(const QRectF &sceneRect, QObject *parent = nullptr)
QGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *parent = nullptr)
virtual ~QGraphicsScene()
QGraphicsItem *activePanel() const
QGraphicsWidget *activeWindow() const
QGraphicsEllipseItem *addEllipse(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush())
QGraphicsEllipseItem *addEllipse(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())
void addItem(QGraphicsItem *item)
QGraphicsLineItem *addLine(const QLineF &line, const QPen &pen = QPen())
QGraphicsLineItem *addLine(qreal x1, qreal y1, qreal x2, qreal y2, const QPen &pen = QPen())
QGraphicsPathItem *addPath(const QPainterPath &path, const QPen &pen = QPen(), const QBrush &brush = QBrush())
QGraphicsPixmapItem *addPixmap(const QPixmap &pixmap)
QGraphicsPolygonItem *addPolygon(const QPolygonF &polygon, const QPen &pen = QPen(), const QBrush &brush = QBrush())
QGraphicsRectItem *addRect(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush())
QGraphicsRectItem *addRect(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())
QGraphicsSimpleTextItem *addSimpleText(const QString &text, const QFont &font = QFont())
QGraphicsTextItem *addText(const QString &text, const QFont &font = QFont())
QGraphicsProxyWidget *addWidget(QWidget *widget, Qt::WindowFlags wFlags = Qt::WindowFlags())
QBrush backgroundBrush() const
int bspTreeDepth() const
void clearFocus()
QList<QGraphicsItem *> collidingItems(const QGraphicsItem *item, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
QGraphicsItemGroup *createItemGroup(const QList<QGraphicsItem *> &items)
void destroyItemGroup(QGraphicsItemGroup *group)
QGraphicsItem *focusItem() const
bool focusOnTouch() const
QFont font() const
QBrush foregroundBrush() const
bool hasFocus() const
qreal height() const
virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const
void invalidate(qreal x, qreal y, qreal w, qreal h, QGraphicsScene::SceneLayers layers = AllLayers)
bool isActive() const
QGraphicsItem *itemAt(const QPointF &position, const QTransform &deviceTransform) const
QGraphicsItem *itemAt(qreal x, qreal y, const QTransform &deviceTransform) const
QGraphicsScene::ItemIndexMethod itemIndexMethod() const
QList<QGraphicsItem *> items(Qt::SortOrder order = Qt::DescendingOrder) const
QList<QGraphicsItem *> items(const QPointF &pos, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const
QList<QGraphicsItem *> items(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const
QList<QGraphicsItem *> items(const QPolygonF &polygon, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const
QList<QGraphicsItem *> items(const QRectF &rect, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const
QList<QGraphicsItem *> items(qreal x, qreal y, qreal w, qreal h, Qt::ItemSelectionMode mode, Qt::SortOrder order, const QTransform &deviceTransform = QTransform()) const
QRectF itemsBoundingRect() const
qreal minimumRenderSize() const
QGraphicsItem *mouseGrabberItem() const
QPalette palette() const
void removeItem(QGraphicsItem *item)
void render(QPainter *painter, const QRectF &target = QRectF(), const QRectF &source = QRectF(), Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio)
QRectF sceneRect() const
QList<QGraphicsItem *> selectedItems() const
QPainterPath selectionArea() const
bool sendEvent(QGraphicsItem *item, QEvent *event)
void setActivePanel(QGraphicsItem *item)
void setActiveWindow(QGraphicsWidget *widget)
void setBackgroundBrush(const QBrush &brush)
void setBspTreeDepth(int depth)
void setFocus(Qt::FocusReason focusReason = Qt::OtherFocusReason)
void setFocusItem(QGraphicsItem *item, Qt::FocusReason focusReason = Qt::OtherFocusReason)
void setFocusOnTouch(bool enabled)
void setFont(const QFont &font)
void setForegroundBrush(const QBrush &brush)
void setItemIndexMethod(QGraphicsScene::ItemIndexMethod method)
void setMinimumRenderSize(qreal minSize)
void setPalette(const QPalette &palette)
void setSceneRect(const QRectF &rect)
void setSceneRect(qreal x, qreal y, qreal w, qreal h)
void setSelectionArea(const QPainterPath &path, const QTransform &deviceTransform)
void setSelectionArea(const QPainterPath &path, Qt::ItemSelectionOperation selectionOperation = Qt::ReplaceSelection, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, const QTransform &deviceTransform = QTransform())
void setStickyFocus(bool enabled)
void setStyle(QStyle *style)
bool stickyFocus() const
QStyle *style() const
void update(qreal x, qreal y, qreal w, qreal h)
QList<QGraphicsView *> views() const
qreal width() const

公共插槽

void advance()
void clear()
void clearSelection()
void invalidate(const QRectF &rect = QRectF(), QGraphicsScene::SceneLayers layers = AllLayers)
void update(const QRectF &rect = QRectF())

信号

void changed(const QList<QRectF> &region)
void focusItemChanged(QGraphicsItem *newFocusItem, QGraphicsItem *oldFocusItem, Qt::FocusReason reason)
void sceneRectChanged(const QRectF &rect)
void selectionChanged()

受保护函数

virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *contextMenuEvent)
virtual void dragEnterEvent(QGraphicsSceneDragDropEvent *event)
virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
virtual void dragMoveEvent(QGraphicsSceneDragDropEvent *event)
virtual void drawBackground(QPainter *painter, const QRectF &rect)
virtual void drawForeground(QPainter *painter, const QRectF &rect)
virtual void dropEvent(QGraphicsSceneDragDropEvent *event)
virtual void focusInEvent(QFocusEvent *focusEvent)
virtual void focusOutEvent(QFocusEvent *focusEvent)
virtual void helpEvent(QGraphicsSceneHelpEvent *helpEvent)
virtual void inputMethodEvent(QInputMethodEvent *event)
virtual void keyPressEvent(QKeyEvent *keyEvent)
virtual void keyReleaseEvent(QKeyEvent *keyEvent)
virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *mouseEvent)
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
virtual void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
virtual void wheelEvent(QGraphicsSceneWheelEvent *wheelEvent)

重新实现的受保护函数

virtual bool event(QEvent *event) override
virtual bool eventFilter(QObject *watched, QEvent *event) override

受保护插槽

virtual bool focusNextPrevChild(bool next)

详细说明

该类是 QGraphicsItems 的容器。它与QGraphicsView 一起用于在二维表面上可视化图形项目,如线条、矩形、文本甚至自定义项目。QGraphicsScene 是图形视图框架的一部分。

QGraphicsScene 还提供了一些功能,可让您有效地确定项目的位置,并确定场景中任意区域内哪些项目是可见的。通过QGraphicsView 小工具,您既可以将整个场景可视化,也可以放大并只查看场景的一部分。

举例说明

QGraphicsScene scene;
scene.addText("Hello, world!");

QGraphicsView view(&scene);
view.show();

请注意,QGraphicsScene 没有自己的可视化外观;它只管理项目。您需要创建一个QGraphicsView widget 来可视化场景。

要向场景中添加项目,首先要构建一个 QGraphicsScene 对象。然后,您有两个选择:要么调用addItem() 添加现有的QGraphicsItem 对象,要么调用addEllipse(),addLine(),addPath(),addPixmap(),addPolygon(),addRect() 或addText() 方便函数之一,这些函数都会返回一个指向新添加项目的指针。使用这些函数添加的项目的尺寸是相对于项目坐标系的,项目在场景中的位置初始化为(0,0)。

然后您可以使用QGraphicsView 可视化场景。当场景发生变化时(例如,当项目移动或转换时),QGraphicsScene 会发出changed() 信号。要移除一个项目,请调用removeItem() 。

QGraphicsScene 使用索引算法来有效管理项目的位置。默认情况下,使用的是 BSP(二进制空间分区)树;这种算法适用于大多数项目保持静态(即不移动)的大型场景。您可以通过调用setItemIndexMethod() 来禁用该索引。有关可用索引算法的更多信息,请参阅itemIndexMethod 属性。

场景的边界矩形是通过调用setSceneRect() 设置的。项目可以放置在场景的任何位置,场景的大小默认为无限。场景矩形仅用于内部记账,维护场景的项目索引。如果未设置场景矩形,QGraphicsScene 将使用itemsBoundingRect() 返回的所有项目的边界区域作为场景矩形。不过,itemsBoundingRect() 是一个相对耗时的函数,因为它通过收集场景中每个项目的位置信息来运行。因此,在对大型场景进行操作时,应始终设置场景矩形。

QGraphicsScene 的最大优势之一就是能有效确定项目的位置。即使场景中有数百万个项目,items() 函数也能在几毫秒内确定项目的位置。items() 有几个重载函数:一个用于查找某个位置上的项目,一个用于查找多边形或矩形内部或与之相交的项目,等等。返回的项目列表按堆叠顺序排序,最上面的项目是列表中的第一个项目。为方便起见,还提供了一个itemAt() 函数,用于返回给定位置上最顶端的项目。

QGraphicsScene 维护场景的选择信息。要选择项目,请调用setSelectionArea() ;要清除当前选择,请调用clearSelection() 。调用selectedItems() 可获得所有选中项的列表。

事件处理和传播

QGraphicsScene 的另一项职责是传播来自QGraphicsView 的事件。要向场景发送事件,您需要构建一个继承于QEvent 的事件,然后使用QCoreApplication::sendEvent() 等函数发送该事件。event() 负责将事件分派给各个项目。一些常见事件由便捷事件处理程序处理。例如,按键事件由keyPressEvent() 处理,鼠标按下事件由mousePressEvent() 处理。

按键事件会传递给焦点项。要设置焦点项目,可以调用setFocusItem() 并传递一个接受焦点的项目,也可以由项目本身调用QGraphicsItem::setFocus() 。调用focusItem() 可获取当前的焦点项。为了与部件兼容,场景也会维护自己的焦点信息。默认情况下,场景没有焦点,所有按键事件都会被丢弃。如果调用setFocus() 或场景中的某个项目获得焦点,场景会自动获得焦点。如果场景有焦点,hasFocus() 将返回 true,按键事件将被转发到焦点项(如果有的话)。如果场景失去焦点(即有人在某个项目有焦点时调用clearFocus() ),场景将保持其项目焦点信息,一旦场景重新获得焦点,它将确保最后一个焦点项目重新获得焦点。

对于鼠标悬停效果,QGraphicsScene 会派发悬停事件。如果项目接受悬停事件(请参阅QGraphicsItem::acceptHoverEvents()) ,那么当鼠标进入其区域时,它将收到GraphicsSceneHoverEnter 事件。当鼠标继续在项目区域内移动时,QGraphicsScene 将向其发送GraphicsSceneHoverMove 事件。当鼠标离开项目区域时,项目将收到GraphicsSceneHoverLeave 事件。

所有鼠标事件都会发送到当前的鼠标抓取项。如果一个项目接受鼠标事件(请参阅QGraphicsItem::acceptedMouseButtons()) 并接收到鼠标按下,它就会成为场景的鼠标抓取器。在没有其他鼠标按钮被按下时,它将一直是鼠标抓取器,直到收到鼠标释放为止。您可以调用mouseGrabberItem() 来确定当前抓取鼠标的项目。

另请参阅 QGraphicsItemQGraphicsView

成员类型文档

enum QGraphicsScene::ItemIndexMethod

该枚举描述了QGraphicsScene 为管理场景中项目的位置信息而提供的索引算法。

常量描述
QGraphicsScene::BspTreeIndex0应用二进制空间分区树。通过使用二进制搜索,QGraphicsScene 的所有项目定位算法的复杂度都接近对数阶。添加、移动和删除项目的复杂度都是对数。这种方法最适合静态场景(即大多数项目不会移动的场景)。
QGraphicsScene::NoIndex-1不应用索引。项目定位具有线性复杂性,因为场景中的所有项目都会被搜索到。不过,添加、移动和删除项目都是在恒定时间内完成的。这种方法非常适合动态场景,在这种场景中,许多项目会不断添加、移动或移除。

另请参阅 setItemIndexMethod() 和bspTreeDepth

枚举 QGraphicsScene::SceneLayer
flags QGraphicsScene::SceneLayers

该枚举描述了QGraphicsScene 中的渲染层。当QGraphicsScene 绘制场景内容时,它会按顺序分别渲染每个层。

每个图层代表一个标志,在调用invalidate() 或QGraphicsView::invalidateScene() 等函数时,可将这些标志进行 OR 编辑。

常量说明
QGraphicsScene::ItemLayer0x1项目层。QGraphicsScene 通过调用虚函数 drawItems() 渲染该层中的所有项目。项目层在背景层之后,前景层之前绘制。
QGraphicsScene::BackgroundLayer0x2背景图层。QGraphicsScene 通过调用虚拟函数drawBackground() 在该图层中渲染场景的背景。在所有图层中,背景图层最先绘制。
QGraphicsScene::ForegroundLayer0x4前景层。QGraphicsScene 通过调用虚拟函数drawForeground() 在该层中渲染场景的前景。前景图层在所有图层中最后绘制。
QGraphicsScene::AllLayers0xffff所有图层;该值表示所有三个图层的组合。

SceneLayers 类型是QFlags<SceneLayer> 的类型定义。它存储场景图层值的 OR 组合。

另请参阅 invalidate() 和QGraphicsView::invalidateScene()。

属性文档

backgroundBrush : QBrush

该属性用于保存场景的背景画笔。

设置该属性可将场景背景更改为不同的颜色、渐变或纹理。默认的背景画笔是Qt::NoBrush 。背景绘制在项目之前(之后)。

示例

QGraphicsScene scene;
QGraphicsView view(&scene);
view.show();

// a blue background
scene.setBackgroundBrush(Qt::blue);

// a gradient background
QRadialGradient gradient(0, 0, 10);
gradient.setSpread(QGradient::RepeatSpread);
scene.setBackgroundBrush(gradient);

QGraphicsScene::render() 调用drawBackground() 绘制场景背景。要更详细地控制背景的绘制方式,可以在QGraphicsScene 的子类中重新实现drawBackground() 。

访问函数:

QBrush backgroundBrush() const
void setBackgroundBrush(const QBrush &brush)

bspTreeDepth : int

该属性表示QGraphicsScene 的 BSP 索引树的深度。

使用NoIndex 时,该属性不起作用。

该值决定了QGraphicsScene 的 BSP 树的深度。深度直接影响QGraphicsScene 的性能和内存使用量;内存使用量随树的深度呈指数增长。有了最佳的树深度,QGraphicsScene 就能立即确定项目的位置,即使是有数千或数百万项目的场景也不例外。这也大大提高了渲染性能。

默认情况下,该值为 0,在这种情况下,Qt 会根据场景中项的大小、位置和数量猜测一个合理的默认深度。但是,如果这些参数经常变化,您可能会遇到速度变慢的问题,因为QGraphicsScene 会在内部重新调整深度。通过设置此属性固定树的深度,可以避免潜在的减速。

树的深度和场景矩形的大小决定了场景分割的粒度。每个场景段的大小由以下算法决定:

QSizeF segmentSize = sceneRect().size() / pow(2, depth - 1);

当每个场景段包含 0 到 10 个项目时,BSP 树的大小最佳。

访问功能:

int bspTreeDepth() const
void setBspTreeDepth(int depth)

另请参阅 itemIndexMethod

focusOnTouch : bool

该属性用于保存项目在收到触摸开始事件时是否获得焦点。

通常的行为是,只有当项目被点击时,焦点才会转移。通常情况下,触摸板上的点击会被操作系统解释为等同于鼠标点击,从而产生一个合成的点击事件作为响应。不过,至少在 macOS 上可以配置这种行为。

默认情况下,当你触摸触控板或类似设备时,QGraphicsScene 也会转移焦点。如果操作系统配置为在触摸触控板时不生成合成鼠标点击,那么这种情况就会令人惊讶。如果操作系统确实会在轻触触控板时产生合成鼠标点击,那么启动触摸手势时的焦点转移就没有必要了。

关闭 focusOnTouch 后,QGraphicsScene 的表现与 macOS 上的表现如出一辙。

默认值为true ,确保默认行为与 5.12 之前的 Qt 版本一样。设置为false 可防止触摸事件触发焦点变化。

访问功能:

bool focusOnTouch() const
void setFocusOnTouch(bool enabled)

font : QFont

此属性保存场景的默认字体

该属性提供场景的字体。场景字体默认为QApplication::font ,并根据 解析其所有条目。

如果场景的字体发生变化,无论是直接通过 setFont() 还是间接通过应用程序字体发生变化,QGraphicsScene 首先会向自己发送FontChange 事件,然后向场景中的所有顶级 widget 项发送FontChange 事件。这些项目会做出响应,将自己的字体解析到场景中,然后通知它们的子项目,子项目再通知它们的子项目,以此类推,直到所有窗口小部件项目都更新了字体。

更改场景字体(直接或间接通过QApplication::setFont() 更改)会自动重新绘制整个场景。

访问功能:

QFont font() const
void setFont(const QFont &font)

另请参阅 QWidget::font,QApplication::setFont(),palette, 和style().

foregroundBrush : QBrush

该属性用于保存场景的前景笔刷。

更改此属性可将场景的前景设置为不同的颜色、渐变或纹理。

前景绘制在项目之后(顶部)。默认前景笔刷为Qt::NoBrush (即不绘制前景)。

示例

QGraphicsScene scene;
QGraphicsView view(&scene);
view.show();

// a white semi-transparent foreground
scene.setForegroundBrush(QColor(255, 255, 255, 127));

// a grid foreground
scene.setForegroundBrush(QBrush(Qt::lightGray, Qt::CrossPattern));

QGraphicsScene::render() 调用drawForeground() 绘制场景前景。要对前景绘制方式进行更详细的控制,可以在QGraphicsScene 子类中重新实现drawForeground() 函数。

访问函数:

QBrush foregroundBrush() const
void setForegroundBrush(const QBrush &brush)

itemIndexMethod : ItemIndexMethod

该属性包含项目索引方法。

QGraphicsScene 将索引算法应用到场景中,以加速项目发现功能(如 () 和 () )。对于静态场景(即项目不会移动),索引是最有效的方法。对于动态场景或有许多动画项目的场景,索引簿记可能会超过快速查找速度。items itemAt

对于普通情况,默认索引方法BspTreeIndex 运行良好。如果您的场景使用了很多动画,并且出现速度变慢的情况,您可以通过调用setItemIndexMethod(NoIndex) 来禁用索引。

访问功能:

QGraphicsScene::ItemIndexMethod itemIndexMethod() const
void setItemIndexMethod(QGraphicsScene::ItemIndexMethod method)

另请参阅 bspTreeDepth

minimumRenderSize : qreal

此属性用于保存绘制项目所需的最小视图变换尺寸。

在渲染场景时,如果任何项目的宽度或高度在转换到目标视图后小于 minimumRenderSize(),则不会被渲染。如果一个项目未被渲染,并且它剪切了其子项目,那么它们也不会被渲染。设置此值可加快在放大视图中渲染大量对象的场景的渲染速度。

默认值为 0。如果不设置,或设置为 0 或负值,则将始终渲染所有项目。

例如,如果一个场景由多个视图渲染,其中一个视图作为总览视图,总是显示所有项目,那么设置此属性就特别有用。在有许多项目的场景中,这样的视图将使用较高的缩放因子,以便显示所有项目。由于缩放的原因,较小的项目在最终渲染的场景中只能起到微不足道的作用。要避免绘制这些项目并减少渲染场景所需的时间,可以调用 setMinimumRenderSize() 设置一个非负值。

注: 因太小而未绘制的项目仍会通过items() 和itemAt() 等方法返回,并参与碰撞检测和交互。建议将 minimumRenderSize() 设置为小于或等于 1 的值,以避免未渲染的大型交互项目。

访问功能:

qreal minimumRenderSize() const
void setMinimumRenderSize(qreal minSize)

另请参见 QStyleOptionGraphicsItem::levelOfDetailFromTransform().

palette : QPalette

该属性保存场景的默认调色板

该属性提供场景的调色板。场景调色板默认为QApplication::palette ,并根据 解析其所有条目。

如果场景的调色板发生变化,无论是直接通过 setPalette() 还是间接通过应用程序调色板发生变化,QGraphicsScene 都会首先向自身发送PaletteChange 事件,然后向场景中的所有顶级 widget 项目发送PaletteChange 事件。这些项目会做出响应,将它们自己的调色板解析到场景中,然后通知它们的子项目,子项目再通知它们的子项目,依此类推,直到所有窗口小部件项目都更新了它们的调色板。

更改场景调色板(直接或间接通过QApplication::setPalette() 更改)会自动重新绘制整个场景。

访问功能:

QPalette palette() const
void setPalette(const QPalette &palette)

另请参阅 QWidget::palette,QApplication::setPalette(),font, 和style().

sceneRect : QRectF

该属性包含场景矩形;场景的边界矩形

场景矩形定义了场景的范围。它主要被QGraphicsView 用来确定视图的默认可滚动区域,以及被QGraphicsScene 用来管理项目索引。

如果未设置或设置为空QRectF ,sceneRect() 将返回自创建场景以来场景中所有项目的最大边界矩形(也就是说,当项目添加到场景或在场景中移动时,矩形会扩大,但不会缩小)。

访问功能:

QRectF sceneRect() const
void setSceneRect(const QRectF &rect)
void setSceneRect(qreal x, qreal y, qreal w, qreal h)

另请参阅 width(),height() 和QGraphicsView::sceneRect

stickyFocus : bool

该属性表示点击场景背景是否会清除焦点。

在将 stickyFocus 设置为 true 的QGraphicsScene 中,当用户点击场景背景或不接受焦点的项目时,焦点将保持不变。否则,焦点将被清除。

默认情况下,此属性为false

焦点会随着鼠标的按下而改变。您可以在QGraphicsScene 的子类中重新实现mousePressEvent() 以根据用户点击的位置切换该属性。

访问函数:

bool stickyFocus() const
void setStickyFocus(bool enabled)

另请参阅 clearFocus() 和setFocusItem()。

成员函数文档

QGraphicsScene::QGraphicsScene(QObject *parent = nullptr)

构造一个 QGraphicsScene 对象。parent 参数传递给QObject 的构造函数。

QGraphicsScene::QGraphicsScene(const QRectF &sceneRect, QObject *parent = nullptr)

构造一个 QGraphicsScene 对象,其场景矩形使用sceneRectparent 参数传递给QObject 的构造函数。

另请参阅 sceneRect

QGraphicsScene::QGraphicsScene(qreal x, qreal y, qreal width, qreal height, QObject *parent = nullptr)

使用 (x,y) 指定的矩形以及给定的widthheight 构建 QGraphicsScene 对象。parent 参数传递给QObject 的构造函数。

另请参阅 sceneRect

[virtual noexcept] QGraphicsScene::~QGraphicsScene()

在销毁场景对象之前,删除场景对象中的所有项目。场景对象将从应用程序的全局场景列表中移除,并从所有关联视图中移除。

QGraphicsItem *QGraphicsScene::activePanel() const

返回当前激活的面板,如果当前没有激活面板,则返回nullptr

另请参阅 QGraphicsScene::setActivePanel().

QGraphicsWidget *QGraphicsScene::activeWindow() const

返回当前活动窗口,如果当前没有活动窗口,则返回nullptr

另请参阅 QGraphicsScene::setActiveWindow().

QGraphicsEllipseItem *QGraphicsScene::addEllipse(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush())

创建并向场景中添加一个椭圆项,并返回该项指针。椭圆的几何形状由rect 定义,它的笔和画笔初始化为penbrush

请注意,项目的几何形状是以项目坐标提供的,其位置初始化为 (0, 0)。

如果项目可见(即QGraphicsItem::isVisible() 返回true ),一旦控制返回事件循环,QGraphicsScene 将发出changed() 。

另请参阅 addLine()、addPath()、addPixmap()、addRect()、addText()、addItem() 和addWidget()。

QGraphicsEllipseItem *QGraphicsScene::addEllipse(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())

此方便函数等同于调用 addEllipse(QRectF(x,y,w,h),pen,brush)。

void QGraphicsScene::addItem(QGraphicsItem *item)

item 及其所有子节点添加或移动到此场景。此场景拥有item 的所有权。

如果项目可见(即QGraphicsItem::isVisible() 返回 true),一旦控制返回事件循环,QGraphicsScene 将发出changed() 命令。

如果该项目已在另一个场景中,则会首先将其从旧场景中移除,然后作为顶层添加到此场景中。

QGraphicsScene 在项目添加到场景时,将向 发送 ItemSceneChange 通知。如果项目当前不属于某个场景,则只发送一次通知。如果它已经属于场景(即它被移动到此场景), 将在项目从其上一个场景移除时发送添加通知。item QGraphicsScene

如果该项目是一个面板,场景处于激活状态,且场景中没有激活的面板,那么该项目将被激活。

另请参阅 removeItem(),addEllipse(),addLine(),addPath(),addPixmap(),addRect(),addText(),addWidget() 和Sorting

QGraphicsLineItem *QGraphicsScene::addLine(const QLineF &line, const QPen &pen = QPen())

创建并向场景中添加线条项,并返回线条项指针。线条的几何形状由line 定义,其笔的初始化值为pen

请注意,项目的几何形状是以项目坐标提供的,其位置初始化为 (0, 0)。

如果项目可见(即QGraphicsItem::isVisible() 返回true ),一旦控制返回事件循环,QGraphicsScene 将发出changed() 。

另请参阅 addEllipse()、addPath()、addPixmap()、addRect()、addText()、addItem() 和addWidget()。

QGraphicsLineItem *QGraphicsScene::addLine(qreal x1, qreal y1, qreal x2, qreal y2, const QPen &pen = QPen())

此方便函数等同于调用 addLine(QLineF(x1,y1,x2,y2),pen)。

QGraphicsPathItem *QGraphicsScene::addPath(const QPainterPath &path, const QPen &pen = QPen(), const QBrush &brush = QBrush())

创建并向场景中添加路径项,并返回项指针。路径的几何形状由path 定义,笔和画笔的初始化值分别为penbrush

请注意,项目的几何形状是以项目坐标提供的,其位置初始化为 (0, 0)。

如果项目可见(即QGraphicsItem::isVisible() 返回true ),一旦控制返回事件循环,QGraphicsScene 将发出changed() 。

另请参阅 addEllipse()、addLine()、addPixmap()、addRect()、addText()、addItem() 和addWidget()。

QGraphicsPixmapItem *QGraphicsScene::addPixmap(const QPixmap &pixmap)

创建并向场景中添加像素图项,并返回项指针。像素图由pixmap 定义。

请注意,项目的几何形状是以项目坐标提供的,其位置初始化为 (0,0)。

如果项目可见(即QGraphicsItem::isVisible() 返回true ),一旦控制返回事件循环,QGraphicsScene 将发出changed() 。

另请参阅 addEllipse()、addLine()、addPath()、addRect()、addText()、addItem() 和addWidget()。

QGraphicsPolygonItem *QGraphicsScene::addPolygon(const QPolygonF &polygon, const QPen &pen = QPen(), const QBrush &brush = QBrush())

创建一个多边形项并将其添加到场景中,然后返回该多边形项的指针。多边形由polygon 定义,它的笔和画笔初始化为penbrush

请注意,项目的几何形状是以项目坐标提供的,其位置初始化为 (0, 0)。

如果项目可见(即QGraphicsItem::isVisible() 返回true ),一旦控制返回事件循环,QGraphicsScene 将发出changed() 。

另请参阅 addEllipse()、addLine()、addPath()、addRect()、addText()、addItem() 和addWidget()。

QGraphicsRectItem *QGraphicsScene::addRect(const QRectF &rect, const QPen &pen = QPen(), const QBrush &brush = QBrush())

创建并向场景中添加一个矩形项,并返回项指针。矩形的几何形状由rect 定义,其钢笔和画笔的初始化值分别为penbrush

请注意,项目的几何形状是以项目坐标提供的,其位置初始化为 (0, 0)。例如,如果添加了QRect(50, 50, 100, 100),那么相对于项目坐标系中的原点,其左上角将位于 (50, 50)。

如果项目可见(即QGraphicsItem::isVisible() 返回true ),一旦控制返回事件循环,QGraphicsScene 将发出changed() 。

另请参阅 addEllipse()、addLine()、addPixmap()、addPixmap()、addText()、addItem() 和addWidget()。

QGraphicsRectItem *QGraphicsScene::addRect(qreal x, qreal y, qreal w, qreal h, const QPen &pen = QPen(), const QBrush &brush = QBrush())

此方便函数等同于调用 addRect(QRectF(x,y,w,h),pen,brush)。

QGraphicsSimpleTextItem *QGraphicsScene::addSimpleText(const QString &text, const QFont &font = QFont())

创建QGraphicsSimpleTextItem 并添加到场景中,然后返回项目指针。文本字符串初始化为text ,字体初始化为font

项目的位置初始化为 (0,0)。

如果项目可见(即QGraphicsItem::isVisible() 返回true ),一旦控制返回事件循环,QGraphicsScene 将发出changed() 。

另请参阅 addEllipse()、addLine()、addPixmap()、addPixmap()、addRect()、addItem() 和addWidget()。

QGraphicsTextItem *QGraphicsScene::addText(const QString &text, const QFont &font = QFont())

创建一个文本项并将其添加到场景中,然后返回文本项指针。文本字符串初始化为text ,字体初始化为font

项目的位置初始化为 (0,0)。

如果项目可见(即QGraphicsItem::isVisible() 返回true ),一旦控制返回事件循环,QGraphicsScene 将发出changed() 。

另请参阅 addEllipse()、addLine()、addPixmap()、addPixmap()、addRect()、addItem() 和addWidget()。

QGraphicsProxyWidget *QGraphicsScene::addWidget(QWidget *widget, Qt::WindowFlags wFlags = Qt::WindowFlags())

widget 创建一个新的QGraphicsProxyWidget ,将其添加到场景中,并返回一个指向代理的指针。wFlags 设置嵌入代理 widget 的默认窗口标志。

该项的位置初始化为 (0,0)。

如果项目可见(即QGraphicsItem::isVisible() 返回true ),一旦控制返回事件循环,QGraphicsScene 将发出changed() 。

请注意,不支持设置了Qt::WA_PaintOnScreen widget 属性的 widget 以及封装了外部应用程序或控制器的 widget。例如QOpenGLWidget 和 QAxWidget。

另请参阅 addEllipse()、addLine()、addPixmap()、addPixmap()、addRect()、addText()、addSimpleText() 和addItem()。

[slot] void QGraphicsScene::advance()

此槽通过调用QGraphicsItem::advance() 来使场景中的所有项目前进一步。这个过程分为两个阶段:在第一阶段,所有项目都会收到场景即将改变的通知;在第二阶段,所有项目都会收到可以移动的通知。在第一阶段,调用QGraphicsItem::advance() 时会将 0 作为参数,而在第二阶段则会将 1 作为参数。

请注意,您也可以使用动画框架制作动画。

另请参阅 QGraphicsItem::advance() 和QTimeLine

[signal] void QGraphicsScene::changed(const QList<QRectF> &region)

当控制到达事件循环时,如果场景内容发生变化,QGraphicsScene 将发出该信号。region 参数包含一个场景矩形列表,显示已更改的区域。

另请参阅 QGraphicsView::updateScene() 。

[slot] void QGraphicsScene::clear()

删除场景中的所有项目,但场景状态保持不变。

另请参阅 addItem().

void QGraphicsScene::clearFocus()

清除场景中的焦点。如果调用此函数时任何项目有焦点,它将失去焦点,并在场景恢复焦点后再次获得焦点。

没有焦点的场景将忽略关键事件。

另请参阅 hasFocus()、setFocus() 和setFocusItem()。

[slot] void QGraphicsScene::clearSelection()

清除当前选择。

另请参阅 setSelectionArea() 和selectedItems() 。

QList<QGraphicsItem *> QGraphicsScene::collidingItems(const QGraphicsItem *item, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const

返回与item 发生碰撞的所有项目的列表。碰撞由调用QGraphicsItem::collidesWithItem() 决定;碰撞检测由mode 决定。默认情况下,所有形状与item 相交或包含在item'形状内的项目都会被返回。

项目以降序堆叠方式返回(即列表中第一个项目为最上项目,最后一个项目为最下项目)。

另请参见 items()、itemAt()、QGraphicsItem::collidesWithItem() 和Sorting

[virtual protected] void QGraphicsScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *contextMenuEvent)

contextMenuEvent 的事件处理程序,可以在子类中重新实现,以接收上下文菜单事件。默认实现会将事件转发给事件发生位置上接受上下文菜单事件的最顶端可见项目。如果在此位置没有项目接受上下文菜单事件,事件将被忽略。

注:请参阅items() 了解此函数将哪些项目视为可见项目的定义。

另请参见 QGraphicsItem::contextMenuEvent()。

QGraphicsItemGroup *QGraphicsScene::createItemGroup(const QList<QGraphicsItem *> &items)

items 中的所有项目分组到一个新的QGraphicsItemGroup 中,并返回指向该组的指针。该组以items 的共同祖先为父,位置为 (0, 0)。所有项目都会被重新父系化到组中,它们的位置和变换也会被映射到组中。如果items 为空,该函数将返回一个空的顶层QGraphicsItemGroup

QGraphicsScene 如果 为空,则该函数将返回一个空的顶层 。要拆除(取消分组)一个组,请调用 () 。destroyItemGroup

另请参阅 destroyItemGroup() 和QGraphicsItemGroup::addToGroup()。

void QGraphicsScene::destroyItemGroup(QGraphicsItemGroup *group)

group 中的所有项目重设为group 的父项目,然后从场景中删除group ,最后将其删除。项目的位置和变换将从组映射到组的父项。

另请参阅 createItemGroup() 和QGraphicsItemGroup::removeFromGroup()。

[virtual protected] void QGraphicsScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event)

该事件处理程序用于事件event ,可在子类中重新实现,以接收场景的拖动输入事件。

默认实现会接受事件,并准备好场景以接受拖动移动事件。

另请参阅 QGraphicsItem::dragEnterEvent()、dragMoveEvent()、dragLeaveEvent() 和dropEvent() 。

[virtual protected] void QGraphicsScene::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)

此事件处理程序用于事件event ,可在子类中重新实现,以接收场景的拖动离开事件。

另请参阅 QGraphicsItem::dragLeaveEvent()、dragEnterEvent()、dragMoveEvent() 和dropEvent() 。

[virtual protected] void QGraphicsScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event)

此事件处理程序用于事件event ,可在子类中重新实现,以接收场景中的拖动移动事件。

注:请参阅items() 了解此函数将哪些项目视为可见项目的定义。

另请参阅 QGraphicsItem::dragMoveEvent()、dragEnterEvent()、dragLeaveEvent() 和dropEvent()。

[virtual protected] void QGraphicsScene::drawBackground(QPainter *painter, const QRectF &rect)

在绘制任何项目和前景之前,使用painter 绘制场景的背景。重新实现此函数可为场景提供自定义背景。

所有绘制都在场景坐标中完成。rect 参数是显示的矩形。

如果只想为背景定义颜色、纹理或渐变,可以调用setBackgroundBrush() 代替。

另请参阅 drawForeground() 和drawItems()。

[virtual protected] void QGraphicsScene::drawForeground(QPainter *painter, const QRectF &rect)

在绘制完背景和所有项目后,使用painter 绘制场景的前景。重新实现此函数可为场景提供自定义前景。

所有绘制都以场景坐标进行。rect 参数是显示的矩形。

如果只想为前景定义颜色、纹理或渐变,可以调用setForegroundBrush() 代替。

另请参阅 drawBackground() 和drawItems()。

[virtual protected] void QGraphicsScene::dropEvent(QGraphicsSceneDragDropEvent *event)

该事件处理程序用于事件event ,可在子类中重新实现,以接收场景中的下拉事件。

另请参阅 QGraphicsItem::dropEvent(),dragEnterEvent(),dragMoveEvent() 和dragLeaveEvent().

[override virtual protected] bool QGraphicsScene::event(QEvent *event)

重实现:QObject::event(QEvent *e)。

处理事件event ,并将其分派给相应的事件处理程序。

除了调用便捷事件处理程序外,该函数还负责将鼠标移动事件转换为悬停事件,以便在没有鼠标抓取项时使用。悬停事件会直接传递给项目,因此没有方便事件处理函数。

QWidget 不同,QGraphicsScene 没有便捷函数enterEvent() 和leaveEvent()。请使用此函数获取这些事件。

如果event 已被识别和处理,则返回true ;否则,返回false

另请参阅 contextMenuEvent(),keyPressEvent(),keyReleaseEvent(),mousePressEvent(),mouseMoveEvent(),mouseReleaseEvent(),mouseDoubleClickEvent(),focusInEvent() 和focusOutEvent() 。

[override virtual protected] bool QGraphicsScene::eventFilter(QObject *watched, QEvent *event)

重实现:QObject::eventFilter(QObject *watched, QEvent *event).

QGraphicsScene 过滤 的事件,以检测调色板和字体的变化。QApplication

[virtual protected] void QGraphicsScene::focusInEvent(QFocusEvent *focusEvent)

该事件处理程序用于事件focusEvent ,可在子类中重新实现,以便在事件中接收焦点。

默认实现将焦点设置为场景,然后再设置为最后一个焦点项。

另请参见 QGraphicsItem::focusOutEvent().

QGraphicsItem *QGraphicsScene::focusItem() const

当场景处于活动状态时,该函数返回场景的当前焦点项,如果当前没有焦点项,则返回nullptr 。当场景处于非活动状态时,此函数返回当场景处于活动状态时将获得输入焦点的项目。

当场景接收到按键事件时,焦点项将接收键盘输入。

另请参阅 setFocusItem()、QGraphicsItem::hasFocus() 和isActive()。

[signal] void QGraphicsScene::focusItemChanged(QGraphicsItem *newFocusItem, QGraphicsItem *oldFocusItem, Qt::FocusReason reason)

每当场景中的焦点发生变化时(即项目获得或失去输入焦点,或焦点从一个项目转移到另一个项目),QGraphicsScene 就会发出该信号。如果需要跟踪其他项目何时获得输入焦点,可以连接到此信号。它对于实现虚拟键盘、输入法和光标项目特别有用。

oldFocusItem newFocusItem 是指向获得输入焦点的项目的指针,如果焦点丢失,则指向 。 是焦点改变的原因(例如,如果场景被停用,而输入字段有焦点, 将指向输入字段项目, 将指向 , 将指向 )。nullptr reason oldFocusItem newFocusItem nullptr reason Qt::ActiveWindowFocusReason

[virtual protected slot] bool QGraphicsScene::focusNextPrevChild(bool next)

根据 Tab 和 Shift+Tab 的情况,查找一个新的部件,将键盘焦点赋予该部件,如果能找到新部件,则返回true ;如果找不到,则返回 false。如果next 为 true,则该函数向前搜索;如果next 为 false,则向后搜索。

您可以在QGraphicsScene 的子类中重新实现该函数,以便对场景中标签焦点的传递方式进行精细控制。默认实现基于QGraphicsWidget::setTabOrder() 定义的标签页焦点链。

[virtual protected] void QGraphicsScene::focusOutEvent(QFocusEvent *focusEvent)

focusEvent 的事件处理程序,可以在子类中重新实现,以接收焦点移出事件。

默认实现是从任何焦点项移除焦点,然后从场景中移除焦点。

另请参见 QGraphicsItem::focusInEvent().

bool QGraphicsScene::hasFocus() const

如果场景有焦点,则返回true ;否则返回false 。如果场景有焦点,它将把来自QKeyEvent 的按键事件转发给任何有焦点的项目。

另请参阅 setFocus() 和setFocusItem() 。

qreal QGraphicsScene::height() const

该方便函数等同于调用sceneRect().height()

另请参阅 width() 。

[virtual protected] void QGraphicsScene::helpEvent(QGraphicsSceneHelpEvent *helpEvent)

helpEvent 的事件处理程序,可以在子类中重新实现,以接收帮助事件。事件类型为QEvent::ToolTip ,在请求工具提示时创建。

默认的实现方式是在鼠标光标位置显示最上方可见项目的工具提示,即 Z 值最高的项目。如果没有项目设置了工具提示,则此函数不会执行任何操作。

注:请参阅items() 了解此函数将哪些项目视为可见项目的定义。

另请参阅 QGraphicsItem::toolTip() 和QGraphicsSceneHelpEvent

[virtual protected] void QGraphicsScene::inputMethodEvent(QInputMethodEvent *event)

该事件处理程序用于事件event ,可在子类中重新实现,以接收场景的输入法事件。

默认实现是将事件转发到focusItem() 。如果当前没有任何项目拥有焦点,或者当前焦点项目不接受输入法,则此函数不会执行任何操作。

另请参阅 QGraphicsItem::inputMethodEvent()。

[virtual] QVariant QGraphicsScene::inputMethodQuery(Qt::InputMethodQuery query) const

输入法使用此方法来查询场景的一组属性,以支持复杂的输入法操作,如支持周围文本和重新转换。

query 参数指定了要查询的属性。

另请参阅 QWidget::inputMethodQuery().

[slot] void QGraphicsScene::invalidate(const QRectF &rect = QRectF(), QGraphicsScene::SceneLayers layers = AllLayers)

使layers 中的内容失效,并安排重新绘制rect 中的场景。layers 中的任何缓存内容都将无条件失效并重新绘制。

您可以使用此函数重载通知QGraphicsScene 场景背景或前景的变化。此函数通常用于具有基于磁贴背景的场景,当QGraphicsView 启用CacheBackground 时通知更改。

举例说明:

QRectF TileScene::rectForTile(int x, int y) const
{
    // Return the rectangle for the tile at position (x, y).
    return QRectF(x * tileWidth, y * tileHeight, tileWidth, tileHeight);
}

void TileScene::setTile(int x, int y, const QPixmap &pixmap)
{
    // Sets or replaces the tile at position (x, y) with pixmap.
    if (x >= 0 && x < numTilesH && y >= 0 && y < numTilesV) {
        tiles[y][x] = pixmap;
        invalidate(rectForTile(x, y), BackgroundLayer);
    }
}

void TileScene::drawBackground(QPainter *painter, const QRectF &exposed)
{
    // Draws all tiles that intersect the exposed area.
    for (int y = 0; y < numTilesV; ++y) {
        for (int x = 0; x < numTilesH; ++x) {
            QRectF rect = rectForTile(x, y);
            if (exposed.intersects(rect))
                painter->drawPixmap(rect.topLeft(), tiles[y][x]);
        }
    }
}

请注意,QGraphicsView 目前仅支持背景缓存(请参阅QGraphicsView::CacheBackground )。如果传递了除BackgroundLayer 以外的任何图层,则此函数等同于调用update() 。

另请参阅 QGraphicsView::resetCachedContent()。

void QGraphicsScene::invalidate(qreal x, qreal y, qreal w, qreal h, QGraphicsScene::SceneLayers layers = AllLayers)

这是一个重载函数。

该方便函数等同于调用 invalidate(QRectF(x,y,w,h),layers);

bool QGraphicsScene::isActive() const

如果场景处于活动状态(例如至少有一个QGraphicsView 处于活动状态),则返回true ;否则返回false

另请参阅 QGraphicsItem::isActive() 和QWidget::isActiveWindow()。

QGraphicsItem *QGraphicsScene::itemAt(const QPointF &position, const QTransform &deviceTransform) const

返回指定position 位置上最顶端的可见项目,如果该位置上没有项目,则返回nullptr

deviceTransform 是适用于视图的变换,如果场景中包含忽略变换的项目,则需要提供该变换。

注:请参阅items() 了解此函数将哪些项目视为可见项目的定义。

另请参阅 items(),collidingItems() 和Sorting

QGraphicsItem *QGraphicsScene::itemAt(qreal x, qreal y, const QTransform &deviceTransform) const

这是一个重载函数。

返回 (x,y) 所指定位置上最顶部的可见项,如果该位置上没有项,则返回nullptr

deviceTransform 是适用于视图的变换,如果场景中包含忽略变换的项目,则需要提供该变换。

此方便函数等同于调用itemAt(QPointF(x, y), deviceTransform)

注:请参阅items() 了解此函数将哪些项目视为可见项目的定义。

QList<QGraphicsItem *> QGraphicsScene::items(Qt::SortOrder order = Qt::DescendingOrder) const

返回场景中所有项目的有序列表。order 决定堆叠顺序。

另请参阅 addItem(),removeItem() 和Sorting

QList<QGraphicsItem *> QGraphicsScene::items(const QPointF &pos, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const

根据mode ,在使用order 排序的列表中,返回位于指定pos 的所有可见项目。在这种情况下,"可见 "定义了以下项目:isVisible() 返回true ,effectiveOpacity() 返回值大于 0.0(全透明),且父项目没有剪切它。

mode 的默认值是Qt::IntersectsItemShape ;所有形状与pos 相交的项目都会被返回。

deviceTransform 是适用于视图的变换,如果场景包含忽略变换的项目,则需要提供该值。

另请参阅 itemAt() 和Sorting

QList<QGraphicsItem *> QGraphicsScene::items(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const

这是一个重载函数。

根据mode ,返回所有位于指定path 内或与指定 相交的可见项目,并以order 排序。在这种情况下,"可见 "定义了以下项目:isVisible() 返回true ,effectiveOpacity() 返回值大于 0.0(即完全透明),且父项目未对其进行剪切。

mode 的默认值是Qt::IntersectsItemShape ;所有精确形状与path 相交或被 包含的项目都会被返回。

deviceTransform 是适用于视图的变换,如果场景包含忽略变换的项目,则需要提供该值。

另请参阅 itemAt() 和Sorting

QList<QGraphicsItem *> QGraphicsScene::items(const QPolygonF &polygon, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const

这是一个重载函数。

根据mode ,返回所有位于指定polygon 内或与指定 相交的可见项目,并以order 排序。在这种情况下,"可见 "定义了以下项目:isVisible() 返回true ,effectiveOpacity() 返回值大于 0.0(即完全透明),且父项目未对其进行剪切。

mode 的默认值是Qt::IntersectsItemShape ;所有精确形状与polygon 相交或被 包含的项目都会被返回。

deviceTransform 是适用于视图的变换,如果场景包含忽略变换的项目,则需要提供该值。

另请参阅 itemAt() 和Sorting

QList<QGraphicsItem *> QGraphicsScene::items(const QRectF &rect, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, Qt::SortOrder order = Qt::DescendingOrder, const QTransform &deviceTransform = QTransform()) const

这是一个重载函数。

根据mode ,返回所有位于指定rect 内或与指定 相交的可见项目,并以order 排序。在这种情况下,"可见 "定义了以下项目:isVisible() 返回true ,effectiveOpacity() 返回值大于 0.0(即完全透明),且父项目未对其进行剪切。

mode 的默认值是Qt::IntersectsItemShape ;所有精确形状与rect 相交或被 包含的项目都会被返回。

deviceTransform 是适用于视图的变换,如果场景包含忽略变换的项目,则需要提供该值。

另请参阅 itemAt() 和Sorting

QList<QGraphicsItem *> QGraphicsScene::items(qreal x, qreal y, qreal w, qreal h, Qt::ItemSelectionMode mode, Qt::SortOrder order, const QTransform &deviceTransform = QTransform()) const

这是一个重载函数。

根据mode ,返回所有位于xywh 所定义矩形内或与之相交的可见项目,并以order 排序。在这种情况下,"可见 "定义了以下项目: isVisible() 返回true , effectiveOpacity() 返回值大于 0.0(全透明),且父项目没有剪切它。

deviceTransform 是适用于视图的变换,如果场景中包含忽略变换的项目,则需要提供该变换。

QRectF QGraphicsScene::itemsBoundingRect() const

计算并返回场景中所有项目的边界矩形。此函数通过对所有项目进行迭代来工作,因此对于大型场景可能会比较慢。

另请参见 sceneRect()。

[virtual protected] void QGraphicsScene::keyPressEvent(QKeyEvent *keyEvent)

keyEvent 的事件处理程序,可以在子类中重新实现,以接收按键事件。默认实现是将事件转发给当前焦点项。

另请参见 QGraphicsItem::keyPressEvent() 和focusItem()。

[virtual protected] void QGraphicsScene::keyReleaseEvent(QKeyEvent *keyEvent)

keyEvent 的事件处理程序,可以在子类中重新实现,以接收按键释放事件。默认实现是将事件转发给当前焦点项。

另请参见 QGraphicsItem::keyReleaseEvent() 和focusItem()。

[virtual protected] void QGraphicsScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *mouseEvent)

mouseEvent 的事件处理程序,可以在子类中重新实现,以接收场景的鼠标双击事件。

如果有人双击场景,场景将首先收到鼠标按下事件,然后是释放事件(即单击),接着是双击事件,最后是释放事件。如果双击事件的对象与第一次按下和释放事件的对象不同,它将作为按下事件发送。但是,在这种情况下,三重点击事件不会作为双击事件发送。

默认实现与mousePressEvent() 类似。

注:请参阅items() 了解此函数将哪些项目视为可见项目的定义。

另请参阅 QGraphicsItem::mousePressEvent()、QGraphicsItem::mouseMoveEvent()、QGraphicsItem::mouseReleaseEvent() 和QGraphicsItem::setAcceptedMouseButtons()。

QGraphicsItem *QGraphicsScene::mouseGrabberItem() const

返回当前鼠标抓取项,如果当前没有鼠标抓取项,则返回nullptr 。鼠标抓取项是接收所有发送到场景中的鼠标事件的项目。

当一个项目接收到并接受到鼠标按下事件时,它就会成为鼠标抓取器,并且在以下任一事件发生之前,它都会一直是鼠标抓取器:

  • 如果项目在没有其他按钮被按下时接收到鼠标释放事件,它将失去鼠标抓取功能。
  • 如果该项目变为不可见(即有人调用item->setVisible(false) ),或变为禁用(即有人调用item->setEnabled(false) ),它将失去鼠标抓取功能。
  • 如果项目从场景中移除,它将失去鼠标抓取功能。

如果项目失去了鼠标抓取功能,场景将忽略所有鼠标事件,直到有新项目抓取鼠标(即直到有新项目接收到鼠标按下事件)。

[virtual protected] void QGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)

该事件处理程序用于事件mouseEvent ,可在子类中重新实现,以接收场景中的鼠标移动事件。

默认实现取决于鼠标抓取器状态。如果有鼠标抓取项,事件就会发送到鼠标抓取器。如果在当前位置有任何接受悬停事件的项目,事件将被转换为悬停事件并被接受;否则将被忽略。

另请参阅 QGraphicsItem::mousePressEvent()、QGraphicsItem::mouseReleaseEvent()、QGraphicsItem::mouseDoubleClickEvent() 和QGraphicsItem::setAcceptedMouseButtons()。

[virtual protected] void QGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)

该事件处理程序用于事件mouseEvent ,可在子类中重新实现,以接收场景中的鼠标按压事件。

默认实现取决于场景的状态。如果有鼠标抓取项,则事件会发送到鼠标抓取项。否则,事件会被转发到场景位置上接受鼠标事件的最顶端可见项目,该项目会立即成为鼠标抓取项目。

如果在场景的给定位置上没有项目,选择区域将被重置,任何焦点项目都将失去输入焦点,然后事件将被忽略。

注:请参阅items() 了解此函数将哪些项目视为可见项目的定义。

另请参阅 QGraphicsItem::mousePressEvent() 和QGraphicsItem::setAcceptedMouseButtons()。

[virtual protected] void QGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)

该事件处理程序用于事件mouseEvent ,可在子类中重新实现,以接收场景中的鼠标释放事件。

默认实现取决于鼠标抓取器的状态。如果没有鼠标抓取器,事件将被忽略。否则,如果有鼠标抓取器项目,事件将被发送到鼠标抓取器。如果鼠标释放代表最后一次按下鼠标上的按钮,则鼠标抓取器项目将失去鼠标抓取功能。

另请参阅 QGraphicsItem::mousePressEvent()、QGraphicsItem::mouseMoveEvent()、QGraphicsItem::mouseDoubleClickEvent() 和QGraphicsItem::setAcceptedMouseButtons()。

void QGraphicsScene::removeItem(QGraphicsItem *item)

从场景中删除项目item 及其所有子项目。item 的所有权将转交给调用者(即QGraphicsScene 在销毁时将不再删除item )。

另请参阅 addItem()。

void QGraphicsScene::render(QPainter *painter, const QRectF &target = QRectF(), const QRectF &source = QRectF(), Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio)

使用painter 将场景中的source 矩形渲染到target 中。该函数可用于将场景内容捕捉到绘画设备上,如QImage (如截图),或使用 QPrinter 打印。例如

QGraphicsScene scene;
scene.addItem(...
...
QPrinter printer(QPrinter::HighResolution);
printer.setPaperSize(QPrinter::A4);

QPainter painter(&printer);
scene.render(&painter);

如果source 是一个空矩形,该函数将使用sceneRect() 来确定要渲染的内容。如果target 是空矩形,则将使用painter'绘图设备'的尺寸。

源矩形内容将根据aspectRatioMode 进行转换,以适应目标矩形。默认情况下,长宽比将保持不变,而source 将按比例调整以适合target

另请参阅 QGraphicsView::render() 。

[signal] void QGraphicsScene::sceneRectChanged(const QRectF &rect)

每当场景矩形发生变化时,QGraphicsScene 就会发出该信号。rect 参数是新的场景矩形。

另请参见 QGraphicsView::updateSceneRect().

QList<QGraphicsItem *> QGraphicsScene::selectedItems() const

返回当前选中的所有项目的列表。项目不按特定顺序返回。

另请参阅 setSelectionArea()。

QPainterPath QGraphicsScene::selectionArea() const

返回之前用setSelectionArea() 设置的选择区域,如果没有设置选择区域,则返回空QPainterPath

另请参阅 setSelectionArea()。

[signal] void QGraphicsScene::selectionChanged()

每当选择项发生变化时,QGraphicsScene 就会发出该信号。您可以调用selectedItems() 获取新的选中项列表。

每当一个项目被选中或取消选中,一个选择区域被设置、清除或以其他方式更改,一个预选项目被添加到场景中,或一个已选项目从场景中移除,选择都会发生变化。

QGraphicsScene 对于组选择操作,"选择 "只发出一次信号。例如,如果您设置了一个选择区域,选择或取消选择了一个 ,或者如果您从场景中添加或删除了一个包含多个选定项的父项,那么 selectionChanged() 只会在操作完成后发出一次信号(而不是针对每个项发出一次信号)。QGraphicsItemGroup

另请参阅 setSelectionArea()、selectedItems() 和QGraphicsItem::setSelected()。

bool QGraphicsScene::sendEvent(QGraphicsItem *item, QEvent *event)

通过可能的事件筛选器向项目item 发送事件event

只有启用了项目,才会发送事件。

如果事件已被过滤或项目已禁用,则返回false 。否则,返回事件处理程序返回的值。

另请参阅 QGraphicsItem::sceneEvent() 和QGraphicsItem::sceneEventFilter()。

void QGraphicsScene::setActivePanel(QGraphicsItem *item)

激活item ,它必须是此场景中的一个项目。您也可以为item 传递 0,在这种情况下,QGraphicsScene 将停用任何当前激活的面板。

如果场景当前处于非活动状态,item 将保持非活动状态,直到场景变为活动状态(或者,如果itemnullptr ,则不会激活任何项目)。

另请参阅 activePanel()、isActive() 和QGraphicsItem::isActive()。

void QGraphicsScene::setActiveWindow(QGraphicsWidget *widget)

激活widget ,它必须是此场景中的一个窗口小部件。您也可以为widget 传递 0,在这种情况下,QGraphicsScene 将停用任何当前活动窗口。

另请参阅 activeWindow() 和QGraphicsWidget::isActiveWindow()。

void QGraphicsScene::setFocus(Qt::FocusReason focusReason = Qt::OtherFocusReason)

通过向场景发送QFocusEvent 来设置场景的焦点,并将focusReason 作为原因。如果场景在某个项目有焦点时重新获得焦点,则最后一个焦点项目将获得焦点,并将focusReason 作为原因。

如果场景已经拥有焦点,则此函数不会执行任何操作。

另请参阅 hasFocus()、clearFocus() 和setFocusItem()。

void QGraphicsScene::setFocusItem(QGraphicsItem *item, Qt::FocusReason focusReason = Qt::OtherFocusReason)

将场景的焦点项目设置为item ,焦点理由为focusReason ,然后移除之前可能有焦点的任何项目的焦点。

如果itemnullptr ,或者不接受焦点(即未启用QGraphicsItem::ItemIsFocusable 标志),或者不可见或未启用,则此函数只移除之前任何焦点项的焦点。

如果项目不是nullptr ,且场景当前没有焦点(即hasFocus() 返回false ),则此函数将自动调用setFocus()。

另请参阅 focusItem()、hasFocus() 和setFocus()。

void QGraphicsScene::setSelectionArea(const QPainterPath &path, const QTransform &deviceTransform)

将选择区域设置为path 。该区域内的所有项目都会立即被选中,而该区域外的所有项目都不会被选中。您可以通过调用selectedItems() 获取所有选中项的列表。

deviceTransform 是适用于视图的变换,如果场景中包含忽略变换的项目,则需要提供该变换。

要选中一个项目,必须将其标记为可选(QGraphicsItem::ItemIsSelectable)。

另请参阅 clearSelection() 和selectionArea()。

void QGraphicsScene::setSelectionArea(const QPainterPath &path, Qt::ItemSelectionOperation selectionOperation = Qt::ReplaceSelection, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, const QTransform &deviceTransform = QTransform())

这是一个重载函数。

使用mode 将选择区域设置为path ,以确定选择区域中是否包含项目。

deviceTransform 是适用于视图的变换,如果场景中包含忽略变换的项目,则需要提供该变换。

selectionOperation 决定如何处理当前选中的项目。

另请参阅 clearSelection() 和selectionArea()。

void QGraphicsScene::setStyle(QStyle *style)

将场景的样式设置或替换为style ,并将样式重新设为该场景的样式。之前分配的样式将被删除。场景的默认样式为QApplication::style() ,并作为场景中所有QGraphicsWidget 项目的默认样式。

无论是直接调用此函数还是间接调用QApplication::setStyle() 来更改样式,都会自动更新场景中所有未明确分配样式的部件的样式。

如果stylenullptrQGraphicsScene 将恢复为QApplication::style()。

另请参见 style()。

QStyle *QGraphicsScene::style() const

返回场景的样式,如果场景没有明确指定样式,则返回与QApplication::style() 相同的样式。

另请参见 setStyle()。

[slot] void QGraphicsScene::update(const QRectF &rect = QRectF())

安排重新绘制现场区域rect

另请参阅 sceneRect() 和changed()。

void QGraphicsScene::update(qreal x, qreal y, qreal w, qreal h)

这是一个重载函数。

该函数等同于调用 update(QRectF(x,y,w,h));

QList<QGraphicsView *> QGraphicsScene::views() const

返回显示此场景的所有视图的列表。

另请参阅 QGraphicsView::scene()。

[virtual protected] void QGraphicsScene::wheelEvent(QGraphicsSceneWheelEvent *wheelEvent)

wheelEvent 的事件处理程序,可以在子类中重新实现,以接收场景中的鼠标滚轮事件。

默认情况下,事件会传递到光标下最上方的可见项目。如果被忽略,事件会传播到下面的项目,直到事件被接受或到达场景为止。如果没有项目接受事件,则事件将被忽略。

注:请参阅items() 了解此函数将哪些项目视为可见项目的定义。

另请参阅 QGraphicsItem::wheelEvent().

qreal QGraphicsScene::width() const

此方便函数等同于调用sceneRect().width() 。

另请参见 height()。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.