QGraphicsScene 类

QGraphicsScene 类提供了一个管理大量 2D 图形项的表面。 更多...

头文件 #include <QGraphicsScene>
CMakefind_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmakeQT += widgets
继承自 QObject

公共类型

枚举ItemIndexMethod { BspTreeIndex, NoIndex }
枚举SceneLayer { ItemLayer, BackgroundLayer, ForegroundLayer, AllLayers }
标志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())
voidaddItem(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())
QBrushbackgroundBrush() const
intbspTreeDepth() const
voidclearFocus()
QList<QGraphicsItem *>collidingItems(const QGraphicsItem *item, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
QGraphicsItemGroup *createItemGroup(const QList<QGraphicsItem *> &items)
voiddestroyItemGroup(QGraphicsItemGroup *group)
QGraphicsItem *focusItem() const
boolfocusOnTouch() const
QFontfont() const
QBrushforegroundBrush() const
boolhasFocus() const
qrealheight() const
virtual QVariantinputMethodQuery(Qt::InputMethodQuery query) const
voidinvalidate(qreal x, qreal y, qreal w, qreal h, QGraphicsScene::SceneLayers layers = AllLayers)
boolisActive() const
QGraphicsItem *itemAt(const QPointF &position, const QTransform &deviceTransform) const
QGraphicsItem *itemAt(qreal x, qreal y, const QTransform &deviceTransform) const
QGraphicsScene::ItemIndexMethoditemIndexMethod() 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 QRectF &rect, 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 QPainterPath &path, 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
QRectFitemsBoundingRect() const
qrealminimumRenderSize() const
QGraphicsItem *mouseGrabberItem() const
QPalettepalette() const
voidremoveItem(QGraphicsItem *item)
voidrender(QPainter *painter, const QRectF &target = QRectF(), const QRectF &source = QRectF(), Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio)
QRectFsceneRect() const
QList<QGraphicsItem *>selectedItems() const
QPainterPathselectionArea() const
boolsendEvent(QGraphicsItem *item, QEvent *event)
voidsetActivePanel(QGraphicsItem *item)
voidsetActiveWindow(QGraphicsWidget *widget)
voidsetBackgroundBrush(const QBrush &brush)
voidsetBspTreeDepth(int depth)
voidsetFocus(Qt::FocusReason focusReason = Qt::OtherFocusReason)
voidsetFocusItem(QGraphicsItem *item, Qt::FocusReason focusReason = Qt::OtherFocusReason)
voidsetFocusOnTouch(bool enabled)
voidsetFont(const QFont &font)
voidsetForegroundBrush(const QBrush &brush)
voidsetItemIndexMethod(QGraphicsScene::ItemIndexMethod method)
voidsetMinimumRenderSize(qreal minSize)
voidsetPalette(const QPalette &palette)
voidsetSceneRect(const QRectF &rect)
voidsetSceneRect(qreal x, qreal y, qreal c, qreal h)
voidsetSelectionArea(const QPainterPath &path, const QTransform &deviceTransform)
voidsetSelectionArea(const QPainterPath &path, Qt::ItemSelectionOperation selectionOperation = Qt::ReplaceSelection, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape, const QTransform &deviceTransform = QTransform())
voidsetStickyFocus(bool enabled)
voidsetStyle(QStyle *style)
boolstickyFocus() const
QStyle *style() const
voidupdate(qreal x, qreal y, qreal c, qreal h)
QList<QGraphicsView *>views() const
qrealwidth() const

公共槽

voidadvance()
voidclear()
voidclearSelection()
voidinvalidate(const QRectF &rect = QRectF(), QGraphicsScene::SceneLayers layers = AllLayers)
voidupdate(const QRectF &rect = QRectF())

信号

voidchanged(const QList<QRectF> &region)
voidfocusItemChanged(QGraphicsItem *newFocusItem, QGraphicsItem *oldFocusItem, Qt::FocusReason reason)
voidsceneRectChanged(const QRectF &rect)
voidselectionChanged()

受保护的函数

virtual voidcontextMenuEvent(QGraphicsSceneContextMenuEvent *contextMenuEvent)
virtual voiddragEnterEvent(QGraphicsSceneDragDropEvent *event)
virtual voiddragLeaveEvent(QGraphicsSceneDragDropEvent *event)
virtual voiddragMoveEvent(QGraphicsSceneDragDropEvent *event)
virtual voiddrawBackground(QPainter *painter, const QRectF &rect)
virtual voiddrawForeground(QPainter *painter, const QRectF &rect)
virtual voiddropEvent(QGraphicsSceneDragDropEvent *event)
virtual voidfocusInEvent(QFocusEvent *focusEvent)
virtual voidfocusOutEvent(QFocusEvent *focusEvent)
virtual voidhelpEvent(QGraphicsSceneHelpEvent *helpEvent)
virtual voidinputMethodEvent(QInputMethodEvent *event)
virtual voidkeyPressEvent(QKeyEvent *keyEvent)
virtual voidkeyReleaseEvent(QKeyEvent *keyEvent)
virtual voidmouseDoubleClickEvent(QGraphicsSceneMouseEvent *mouseEvent)
virtual voidmouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
virtual voidmousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
virtual voidmouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
virtual voidwheelEvent(QGraphicsSceneWheelEvent *wheelEvent)

重写的受保护函数

virtual boolevent(QEvent *event) override
virtual booleventFilter(QObject *watched, QEvent *event) override

受保护槽

virtual boolfocusNextPrevChild(bool next)

详细信息

该类用于存储QGraphicsItems。它与QGraphicsView一起使用,用于在二维表面上可视化图形项,如线条、矩形、文本甚至自定义项。QGraphicsScene是Graphics View Framework的一部分。

QGraphicsScene还提供功能,可以让你有效地确定项的位置以及在场景中的任意区域内的可见项。使用QGraphicsView小部件,你可以查看整个场景,也可以放大查看场景的某部分。

示例

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

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

请注意,QGraphicsScene本身没有视觉外观;它只管理项。你需要创建一个QGraphicsView小部件来可视化场景。

要将项添加到场景中,你首先需要构造一个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

enum QGraphicsScene::SceneLayer
flags QGraphicsScene::SceneLayers

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

每一层代表一个可以在调用invalidate()或QGraphicsView::invalidateScene()等函数时进行或操作的标志。

常量描述
QGraphicsScene::ItemLayer0x1图层。由QGraphicsScene通过调用虚拟函数drawItems()渲染所有项在该图层上。项图层是在背景图层之后、前景图层之前绘制的。
QGraphicsScene::BackgroundLayer0x2背景图层。由QGraphicsScene通过调用虚拟函数drawBackground()在此图层上渲染场景的背景。背景图层是所有图层中第一个绘制的。
QGraphicsScene::ForegroundLayer0x4前景图层。由QGraphicsScene通过调用虚拟函数drawForeground()在此图层上渲染场景的前景。前景图层是所有图层中最后一个绘制的。
QGraphicsScene::AllLayers0xffff所有图层;此值代表所有三个图层的组合。

SceneLayers类型是对QFlags<SceneLayer>的别名。它存储SceneLayer值的或组合。

另请参阅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()。

访问函数

QBrushbackgroundBrush() const
voidsetBackgroundBrush(const QBrush &brush)

bspTreeDepth : int

此属性保存QGraphicsScene的BSP索引树的深度。

当使用NoIndex时,此属性没有作用。

此值确定QGraphicsScene的BSP树的深度。深度直接影响QGraphicsScene的性能和内存使用;后者随着树深度的增加而呈指数增长。具有优化的树深度,QGraphicsScene可以即时确定项的位置,甚至对于包含成千上万个项目的场景也是如此。这也大大提高了渲染性能。

默认情况下,此值是0,在这种情况下,Qt将根据场景中的大小、位置和项的数量猜测一个合理的默认深度。但是,如果这些参数频繁变化,您可能会在QGraphicsScene内部调整深度时遇到 slowdowns。您可以通过设置此属性来固定树深度,从而避免潜在的 slowdowns。

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

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

BSP树在每段包含0到10个项时具有最佳大小。

访问函数

intbspTreeDepth() const
voidsetBspTreeDepth(int depth)

另请参阅itemIndexMethod

focusOnTouch : bool

此属性保存项目是否在收到touch begin事件时获得焦点。

通常的行为是在点击项目时才转移焦点。通常操作系统会将触摸板的轻触视为与鼠标点击等价,生成相应的点击事件。然而,至少在macOS上,您可以配置这种行为。

默认情况下,当您在触摸板上或类似设备上触摸时,QGraphicsScene也会转移焦点。如果操作系统配置为不在触摸板上轻触时生成合成鼠标点击,这可能会令人惊讶。如果操作系统在触摸板上轻触时生成合成鼠标点击,则在启动触摸手势时转移焦点是不必要的。

关闭focusOnTouch后,QGraphicsScene的行为将类似于macOS上的预期。

默认值是true,确保默认行为与5.12之前的Qt版本相同。设置为false可防止触摸事件触发焦点更改。

访问函数

boolfocusOnTouch() const
voidsetFocusOnTouch(bool enabled)

font : QFont

此属性包含场景的默认字体

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

如果场景的字体发生变化,无论是通过setFont()直接变更还是通过应用字体变更而间接变更,QGraphicsScene首先会发送一个FontChange事件给自己,然后向场景中所有顶级小部件项发送FontChange事件。这些项响应自己的字体解析到场景,并通知它们的子项,子项再次通知其子项,依此类推,直到所有小部件项都已更新它们的字体。

更改场景字体(直接或通过QApplication::setFont间接),将自动安排整个场景的重绘。

访问函数

QFontfont() const
voidsetFont(const QFont &font)

另请参阅QWidget::fontQApplication::setFontpalettestyle

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()函数。

访问函数

QBrushforegroundBrush() const
voidsetForegroundBrush(const QBrush &brush)

itemIndexMethod : ItemIndexMethod

此属性包含项索引方法

QGraphicsScene会对场景应用一种索引算法,以加速诸如items()和itemAt()之类的项发现功能。对于静态场景(即项不移动的场景),索引效率最高。对于动态场景或有大量动画项的场景,索引簿记可能会超过快速查找速度。

对于常见情况,默认的索引方法 BspTreeIndex 工作正常。如果你的场景使用了许多动画并且你遇到了速度变慢的情况,你可以通过调用 setItemIndexMethod(NoIndex) 来禁用索引。

访问函数

QGraphicsScene::ItemIndexMethoditemIndexMethod() const
voidsetItemIndexMethod(QGraphicsScene::ItemIndexMethod method)

参见bspTreeDepth

minimumRenderSize : qreal

此属性表示项目必须具有的最小视图变换大小,才能被绘制。

在场景渲染时,任何宽度或高度小于 minimumRenderSize() 的目标视图变换的项目都不会被渲染。如果项目没有被渲染,并且它剪贴了其子项目,那么这些子项目也不会被渲染。将此值设置为加快在缩放视图上渲染许多对象场景的速度。

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

例如,设置此属性在场景由多个视图渲染时特别有用,其中一个视图作为概览图,总是显示所有项目。在拥有许多项目的场景中,此类视图将使用一个高缩放因子,以便所有项目都可以显示。由于缩放,较小的项目对最终渲染场景的贡献微乎其微。为了避免绘制这些项目并减少渲染场景所需的时间,您可以调用 setMinimumRenderSize() 并传递一个非负值。

注意:由于太小而没有被绘制的项目,仍然可以通过类似于 items() 和 itemAt() 的方法返回,并且参与碰撞检测和交互。为了避免大型不可渲染但交互式项目,建议将 minimumRenderSize() 设置为小于或等于 1 的值。

访问函数

qrealminimumRenderSize() const
voidsetMinimumRenderSize(qreal minSize)

参见QStyleOptionGraphicsItem::levelOfDetailFromTransform

palette : QPalette

该属性包含场景的默认调色板。

此属性提供了场景的调色板。场景调色板默认来自,并从 QApplication::palette 解析所有条目。

如果场景的调色板发生变化,无论是直接通过 setPalette() 还是间接在应用程序调色板更改时,QGraphicsScene 首先发送给自己一个 PaletteChange 事件,然后它给场景中所有顶级小部件发送 PaletteChange 事件。这些项目通过将其自己的调色板解析为场景来响应,然后它们通知其子项目,子项目再次通知其子项目,依此类推,直到所有小部件都更新了它们的调色板。

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

访问函数

QPalettepalette() const
voidsetPalette(const QPalette &palette)

参见QWidget::paletteQApplication::setPalettefontstyle

sceneRect : QRectF

该属性保存场景矩形;场景的边界矩形

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

如果未设置,或设置为空的 QRectF,则 sceneRect() 将返回自场景创建以来所有项的最大边界矩形(即,当向场景添加项或在场景中移动时,矩形会增大,但永不缩小)。

访问函数

QRectFsceneRect() const
voidsetSceneRect(const QRectF &rect)
voidsetSceneRect(qreal x, qreal y, qreal w, qreal h)

另请参阅宽度(), 高度(), 以及 QGraphicsView::sceneRect

stickyFocus : bool

该属性保存单击场景背景是否清除焦点

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

默认情况下,此属性为 false

焦点更改响应鼠标按下。您可以在 QGraphicsScene 的子类中重新实现 mousePressEvent() 以根据用户单击的位置切换此属性。

访问函数

boolstickyFocus() const
voidsetStickyFocus(bool enabled)

另请参阅clearFocus() 和 setFocusItem

成员函数文档

QGraphicsScene::QGraphicsScene(QObject *parent = nullptr)

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

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

构造 QGraphicsScene 对象,使用 sceneRect 作为其场景矩形。将 parent 参数传递给 QObject 的构造函数。

另请参阅sceneRect

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

构造 QGraphicsScene 对象,使用由 (x, y) 指定的矩形,并给定的 widthheight 作为其场景矩形的宽度和高度。将 parent 参数传递给 QObject 的构造函数。

另请参阅sceneRect

[虚拟 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 在将其添加到场景时会向 item 发送 ItemSceneChange 通知。如果 item 当前不属于任何场景,则只会发送一条通知。如果它已经属于场景(即,已移动到该场景),则当 item 从其前一个场景移除时,QGraphicsScene 还会发送一条附加通知。

如果 item 是一个面板,场景处于活动状态,并且场景中没有活动面板,则该项将被激活。

另请参阅 removeItem(),addEllipse(),addLine(),addPath(),addPixmap(),addRect(),addText(),addWidget() 以及 排序

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

创建并添加一条线到场景,并返回该条线的指针。线的几何形状由 line 定义,其笔(pen)初始化为 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 定义,其笔和画刷(brush)初始化为 penbrush

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

如果项目是可见的(即,QGraphicsItem::isVisible() 返回 true),则当控制返回事件循环时,QGraphicsScene 将发射 changed()。

另请参阅 addEllipse(),addLine(),addPixmap(),addRect(),addText(),addItem() 以及 addWidget()。

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

创建并添加一个 pixmap 项到场景,并返回该项的指针。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 设置内部代理小部件的默认窗口标志。

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

如果项目是可见的(即,QGraphicsItem::isVisible() 返回 true),则当控制返回事件循环时,QGraphicsScene 将发射 changed()。

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

另请参阅addEllipse(), addLine(), addPixmap(), addPixmap(), addRect(), addText(), addSimpleText(), 和 addItem().

[槽] void QGraphicsScene::advance()

此槽通过调用 QGraphicsItem::advance() 为场景上的所有项 前进 一步。这分两阶段进行:在第一阶段,所有项都会收到即将更改场景的通知,在第二阶段,所有项都会收到可以移动的通知。在第一阶段,QGraphicsItem::advance() 传递 0 作为参数调用,在第二阶段传递 1。

请注意,还可以使用 动画框架 进行动画。

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

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

当事件循环达到 QGraphicsScene 时,如果场景内容更改,此信号会发出。region 参数包含表示已更改区域的场景矩形的列表。

另请参阅QGraphicsView::updateScene().

[槽] 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() 和 排序

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

此事件处理器,用于处理 contextMenuEvent 事件,可在子类中重写以接收上下文菜单事件。默认实现将事件转发到接受上下文菜单事件的顶部可见项目,位置在事件位置。如果没有项目在此位置接受上下文菜单事件,则忽略该事件。

注意:有关该函数认为哪些项目是可见的,请参阅 items() 的定义。

另请参阅items()。

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,最后删除它。将项目位置和转换从组映射到组的父项。

另请参阅createItemGroup() 和 destroyItemGroup()。

[虚拟保护] void QGraphicsScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event)

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

默认实现接受事件,并为接收拖动移动事件准备场景。

另请参阅QGraphicsItem::dragEnterEventdragMoveEventdragLeaveEventdropEvent

[虚拟保护] void QGraphicsScene::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)

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

另请参阅QGraphicsItem::dragLeaveEventdragEnterEventdragMoveEventdropEvent

[虚拟保护] void QGraphicsScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event)

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

注意:有关该函数认为哪些项目是可见的,请参阅 items() 的定义。

另请参阅QGraphicsItem::dragMoveEventdragEnterEventdragLeaveEventdropEvent

[虚拟保护] void QGraphicsScene::drawBackground(QPainter *painter, const QRectF &rect)

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

所有绘制都在 场景 坐标系中进行。参数 rect 是暴露的矩形。

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

另请参阅drawForegrounddrawItems

[虚拟保护] void QGraphicsScene::drawForeground(QPainter *painter, const QRectF &rect)

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

所有绘制都在 场景 坐标系中进行。参数 rect 是暴露的矩形。

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

另请参阅drawBackgrounddrawItems

[虚拟保护] void QGraphicsScene::dropEvent(QGraphicsSceneDragDropEvent *event)

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

另请参见 QGraphicsItem::dropEvent(),dragEnterEvent(),dragMoveEvent(),和 dragLeaveEvent()。

[重写虚拟保护] 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()。

[重写虚拟保护] bool QGraphicsScene::eventFilter(QObject *watched, QEvent *event)

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

QGraphicsScene 过滤 QApplication 的事件以检测调色板和字体更改。

[虚拟保护] void QGraphicsScene::focusInEvent(QFocusEvent *focusEvent)

此事件处理器,针对事件 focusEvent,可以在子类中重新实现以接收焦点进入事件。

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

另请参见 QGraphicsItem::focusOutEvent()。

QGraphicsItem *QGraphicsScene::focusItem() const

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

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

另请参见 setFocusItem(),QGraphicsItem::hasFocus(),以及 isActive()。

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

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

oldFocusItem 是指向之前具有焦点的项目的指针,或者在发出信号之前没有项目具有焦点时为 0。 newFocusItem 是指向获得输入焦点的项目的指针,如果焦点丢失则可以是空指针 nullptrreason 是焦点更改的原因(例如,如果场景在输入字段具有焦点的过程中被停用,oldFocusItem 将指向输入字段项目,newFocusItem 将是空指针,并且 reason 将是 Qt::ActiveWindowFocusReason)。

[虚保护槽] bool QGraphicsScene::focusNextPrevChild(bool next)

根据 Tab 和 Shift+Tab 的适当方式找到一个新小部件来给予键盘焦点,如果可以找到新的小部件,则返回 true,否则返回 false。如果 next 为 true,则该函数向前搜索;如果 next 为 false,则向后搜索。

您可以在 QGraphicsScene 的子类中重写此函数来提供对您场景内 Tab 焦点传递的更精细控制。默认实现基于 QGraphicsWidget::setTabOrder() 定义的 Tab 焦点链。

[虚保护] void QGraphicsScene::focusOutEvent(QFocusEvent *focusEvent)

此事件处理器,用于事件 focusEvent,可以在子类中重新实现以便接收焦点退出事件。

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

另请参阅QGraphicsItem::focusInEvent

bool QGraphicsScene::hasFocus() const

如果场景具有焦点,则返回 true;否则返回 false。如果场景具有焦点,它将转发由 QKeyEvent 发出的按键事件到任何具有焦点的项。

另请参阅setFocus() 和 setFocusItem

qreal QGraphicsScene::height() const

此便捷函数等价于调用 sceneRect().height()

另请参阅width

[虚保护] void QGraphicsScene::helpEvent(QGraphicsSceneHelpEvent *helpEvent)

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

默认的实现会显示最顶层可见项的工具提示,即具有最高z值的项,在鼠标指针位置。如果没有项设置了工具提示,则此函数不执行任何操作。

注意:有关该函数认为哪些项目是可见的,请参阅 items() 的定义。

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

[虚拟受保护] void QGraphicsScene::inputMethodEvent(QInputMethodEvent *event)

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

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

另请参阅QGraphicsItem::inputMethodEvent

[槽] QVariant QGraphicsScene::inputMethodQuery(Qt::InputMethodQuery 查询) const

该方法用于由输入法查询场景的属性集,以便支持复杂输入法操作,如对周围文本的支持和重组。

查询 参数指定查询哪个属性。

另请参阅QWidget::inputMethodQuery

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

使 rect 中的 layers 无效并安排在场景中进行重绘。在 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

返回指定位置处的最顶层可见项目,如果没有项目在此位置,则返回 nullptr

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

注意:有关该函数认为哪些项目是可见的,请参阅 items() 的定义。

另请参阅 items(),collidingItems() 以及 排序

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() 以及 排序

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

返回所有根据 mode 在指定位置 pos 的可见项目列表,并使用 order 排序。在这种情况下,“可见”定义了以下项目:isVisible() 返回 true,effectiveOpacity() 返回一个大于 0.0 的值(这是完全透明的),并且父项目不会裁剪它。

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

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

另请参阅 itemAt() 和 排序

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

这是一个重载函数。

根据模式,返回所有可见项目列表,列表中包含或与指定的 矩形 相交的项目,并且已使用 顺序 进行排序。在这种情况下,“可见”定义了项目,其中 isVisible() 返回 true,effectiveOpacity() 返回大于 0.0 的值(表示完全透明),并且父项目不剪辑它。

模式 的默认值为 Qt::IntersectsItemShape;返回所有精确形状与 矩形 相交或包含 矩形 的项目。

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

另请参阅 itemAt() 和 排序

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

这是一个重载函数。

根据 模式 的不同,返回所有可见项目列表,列表中包含或与指定的 多边形 相交的项目,并且已使用 顺序 进行排序。在这种情况下,“可见”定义了项目,其中 isVisible() 返回 true,effectiveOpacity() 返回大于 0.0 的值(表示完全透明),并且父项目不剪辑它。

模式 的默认值为 Qt::IntersectsItemShape;返回所有精确形状与 多边形 相交或包含 多边形 的项目。

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

另请参阅 itemAt() 和 排序

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

这是一个重载函数。

返回所有可见项目列表,列表中包含或与指定的 路径 相交的项目,并且已使用 顺序 进行排序。在这种情况下,“可见”定义了项目,其中 isVisible() 返回 true,effectiveOpacity() 返回大于 0.0 的值(表示完全透明),并且父项目不剪辑它。

模式 的默认值为 Qt::IntersectsItemShape;返回所有精确形状与 路径 相交或包含 路径 的项目。

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

另请参阅 itemAt() 和 排序

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

这是一个重载函数。

返回所有可见项目列表,列表中包含或与由 xywh 定义的矩形相交的项目,并且已使用 顺序 进行排序。在这种情况下,“可见”定义了项目,其中 isVisible() 返回 true,effectiveOpacity() 返回大于 0.0 的值(表示完全透明),并且父项目不剪辑它。

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

QRectF QGraphicsScene::itemsBoundingRect() const

计算并返回场景中所有项目的边界矩形。此函数通过遍历所有项目来实现,因此对于大型场景来说可能会比较慢。

另请参阅sceneRect()。

[虚拟受保护] void QGraphicsScene::keyPressEvent(QKeyEvent *keyEvent)

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

另请参阅QGraphicsItem::keyPressEvent() 和 focusItem

[虚拟受保护] void QGraphicsScene::keyReleaseEvent(QKeyEvent *keyEvent)

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

另请参阅QGraphicsItem::keyReleaseEvent() 和 focusItem

[虚拟受保护] 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)),它就失去了鼠标抓取。
  • 如果项目从场景中移除,它就失去了鼠标抓取。

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

[虚拟保护] void QGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)

此事件处理器,针对事件 mouseEvent,可以重新实现以接收场景的鼠标移动事件。

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

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

[虚拟保护] void QGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)

此事件处理器,针对事件 mouseEvent,可以重新实现以接收场景的鼠标按下事件。

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

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

注意:有关该函数认为哪些项目是可见的,请参阅 items() 的定义。

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

[虚拟保护] 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()。

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

每当场景矩形更改时,该信号由 QGraphicsScene 发出。参数 rect 是新的场景矩形。

另请参阅QGraphicsView::updateSceneRect()。

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

返回所有当前选定项的列表。项的返回顺序没有特定的顺序。

另请参阅setSelectionArea()。

QPainterPath QGraphicsScene::selectionArea() const

返回先前使用 setSelectionArea 设置的选定区域,如果没有设置选定区域,则为空的 QPainterPath

另请参阅setSelectionArea()。

[信号] void QGraphicsScene::selectionChanged()

每当选定项更改时,该信号由 QGraphicsScene 发出。您可以通过调用 selectedItems() 来获取新的选定项列表。

选中项、取消选中项,设置、清除或更改选定区域,向场景添加预选项,或从场景中移除选定项时,都会更改选定项。

对于分组选定操作,QGraphicsScene 仅发出此信号一次。例如,如果设置选定区域,选择或取消选择 QGraphicsItemGroup,或在场景中添加或移除包含多个选定项的父项,则在操作完成后仅发出一次 selectionChanged()(而不是针对每个项都发出一次)。

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

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

通过可能的事件过滤器将事件 event 发送到项 item

只有当项启用时才发送事件。

如果事件被过滤器过滤或项被禁用,则返回 false。否则返回从事件处理器返回的值。

参阅以下QGraphicsItem::sceneEvent() 和 QGraphicsItem::sceneEventFilter

void QGraphicsScene::setActivePanel(QGraphicsItem *item)

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

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

参阅以下activePanel()、isActive() 以及 QGraphicsItem::isActive

void QGraphicsScene::setActiveWindow(QGraphicsWidget *widget)

激活 widget,它必须属于当前场景中的小部件。也可以传递 0 给 widget,在这种情况下,QGraphicsScene 将停用任何当前激活的窗口。

参阅以下activeWindowQGraphicsWidget::isActiveWindow

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

通过向场景发送 QFocusEvent 并传递 focusReason 作为原因,将焦点设置在场景上。如果场景在先前失去焦点后恢复焦点,而此时某项具有焦点,则最后具有焦点的项将再次获得焦点,并使用 focusReason 作为原因。

如果场景已经具有焦点,则此函数什么也不做。

参阅以下hasFocusclearFocus 以及 setFocusItem

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

将场景的焦点项设置为 item,并移除任何先前可能具有焦点的项的焦点,同时使用 focusReason 作为焦点原因。

如果 itemnullptr,或者它不接受焦点(即,它没有启用 QGraphicsItem::ItemIsFocusable 标志),或者不可见或未启用,则此函数仅从任何先前焦点项中移除焦点。

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

参阅以下focusItemhasFocus 以及 setFocus

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

将选择区域设置为 path。所有在此区域内的项都将立即被选中,而所有在此区域外的项将被取消选中。你可以通过调用 selectedItems() 来获取所有选中项的列表。

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

为了选中项,它必须被标记为 可选择的QGraphicsItem::ItemIsSelectable)。

参阅以下clearSelectionselectionArea

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

这是一个重载函数。

使用mode确定是否将项目包含在选择区域内设置选择区域为path

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

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

参阅以下clearSelectionselectionArea

void QGraphicsScene::setStyle(QStyle *style)

将场景样式设置为style,并将样式重新父化到该场景。任何先前分配的样式将被删除。场景的样式默认为QApplication::style(),并为场景中所有QGraphicsWidget项提供默认值。

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

如果stylenullptr,则QGraphicsScene将恢复为QApplication::style()。

另请参阅样式

QStyle *QGraphicsScene::style() const

返回场景样式,如果没有为场景明确分配样式,则与QApplication::style()相同。

另请参阅setStyle

[槽函数] 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

[虚拟保护] void QGraphicsScene::wheelEvent(QGraphicsSceneWheelEvent *wheelEvent)

此事件处理器,用于事件wheelEvent,可以在子类中重实现以接收场景的鼠标滚轮事件。

默认情况下,事件会传递到光标下方最顶层的可见项。如果忽略,事件会传递到其下方的项,并一直传递,直到事件被接受或到达场景。如果没有项接受事件,则该事件将被忽略。

注意:有关该函数认为哪些项目是可见的,请参阅 items() 的定义。

另请参阅 QGraphicsItem::wheelEvent()。

qreal QGraphicsScene::width() const

此便捷函数与调用sceneRect().width()等效。

另请参阅 height()。

© 2024 The Qt Company Ltd. 本文档中的文档贡献权属各所有者。本提供的文档是根据由自由软件基金会发布的GNU自由文档许可协议的1.3版许可的。Qt及其相关标志是The Qt Company Ltd.在芬兰及世界其他地区的商标。所有其他商标均为各自所有者的财产。