可以按照以下方式简单理解 QGraphicsItem、QGraphicsScene、QGraphicsView 三者的关系:
QGraphicsItems:图形项目(直线、矩形、文本、自定义图形)
QGraphicsScene:场景
QGraphicsView :视口
QGraphicsItem 表示图形项目
QGraphicsScene 作为 QGraphicsItem 的容器,与 QGraphicsView 一起用于在二维平面上可视化整个场景,也可以放大并仅查看场景的一部分。
例如:
scene = QGraphicsScene()
scene.addText("Hello, world!")
view = QGraphicsView(scene)
view.show()
注意:QGraphicsScene 只是一个场景(只负责管理内部的图形项目),需要放入 QGraphicsView 才能实现可视化
QGraphicsScene 提供了一些功能,用于设置图形项目的位置、可见性。除此之外,还负责事件传播。
项目可以放置在场景中的任何位置,默认情况下场景的大小不受限制
图形项目在场景中的位置初始化为(0,0)
当场景发生变化时(例如,当图形项目移动或变换时),QGraphicsScene会发出 changed() 信号
如果图形项目接受鼠标悬停事件,当鼠标进入其区域时,它将接收 GraphicsSceneHoverEnter 事件,当鼠标继续在图形项目内移动的话,QGraphicsScene将向其发送 GraphicsSceneHoverMove 事件;当鼠标离开图形项目的区域时,图形项目将收到 GraphicsSceneHoverLeave 事件。
如果场景中的某个图形项目获得了焦点,则场景会自动获得焦点。如果场景具有焦点,hasFocus() 将返回true,事件将转发到当前获取了焦点的图形项目(如果有的话)
构造函数
PySide6.QtWidgets.QGraphicsScene(sceneRect[, parent=None])
PySide6.QtWidgets.QGraphicsScene(x, y, width, height[, parent=None])
参数:
sceneRect – PySide6.QtCore.QRectF
parent – PySide6.QtCore.QObject
x – float
y – float
width – float
height – float
场景的边界矩形是通过调用 setSceneRef() 来设置的。如果场景边界矩形未设置,QGraphicsScene 将使用itemsBoundingRect() 返回所有图形项目的边界区域作为场景边界矩形。然而,itemsBoundingRect() 是一个相对耗时的函数,因为它通过收集场景中每个图形项目的位置信息来操作。因此,在大型场景中操作时,我们要主动设置场景的边界矩形。
属性
属性名 | 方法 |
---|---|
sceneRect | 场景的边界矩形,类型为 PySide6.QtCore.QRectF |
backgroundBrush | 场景的背景笔刷 |
foregroundBrush | 场景的前景笔刷 |
font | 场景的默认字体 |
函数
函数名 | 描述 |
---|---|
items() | 可以在几毫秒内确定图形项目的位置 |
addEllipse(rect[, pen=QPen()[, brush=QBrush()]]) | 创建椭圆项目并将其添加到场景中,然后返回项目指针。 参数: rect – PySide6.QtCore.QRectF pen – PySide6.QtGui.QPen brush – PySide6.QtGui.QBrush 返回类型: PySide6.QtWidgets.QGraphicsEllipseItem 类似函数还有addLine() 、addPath() 、addPixmap() 、addRect() 、addText() 、addItem() 、addWidget() |
addItem(item) | 添加图形项目 参数: item – PySide6.QtWidgets.QGraphicsItem |
addPixmap(pixmap) | 参数: pixmap – PySide6.QtGui.QPixmap 返回类型: PySide6.QtWidgets.QGraphicsPixmapItem |
QGraphicsView在可滚动视口中可视化QGraphicsScene的内容
QGraphicsView可以将鼠标和键盘事件转换为场景事件(继承自QGraphicsSceneEvent的事件),并将它们转发给可视化的场景。通过创建QGraphicsView的子类并重新实现鼠标和键事件处理程序来提供自己的自定义场景交互,这意味着你可以使用QGraphicsView来创建交互式的图形用户界面,例如可以拖动、缩放和旋转的图形和图片。
此外,QGraphicsView还提供了许多用于调整视图显示的属性和方法。例如,你可以使用alignment属性来调整场景在视图中的对齐方式,使用backgroundBrush和foregroundBrush属性来设置场景的背景和前景,使用setRenderHint方法来设置渲染提示等等。
可以通过 QGraphicsView 的构造函数或 setScene() 函数设置场景。调用 show() 后,默认情况下,视图将滚动到场景的中心,可视化整个场景
scene = QGraphicsScene()
scene.addText("Hello, world!")
view = QGraphicsView(scene)
view.show()
默认情况下,当视图首次显示时(通过调用 itemsBoundingRect() 函数),会自动检测到可视化区域。QGraphicsView通过调用 render() 来可视化场景。默认情况下,使用常规QPainter和默认渲染提示将项目绘制到视口上。
属性
属性名 | 描述 |
---|---|
alignment | 场景在视图中的对齐方式 |
dragMode | 按下鼠标左键时在场景上拖动鼠标的行为 |
interactive | 布尔值(默认值为true),视图是否允许场景交互。为false则不允许交互,任何鼠标或键盘事件都将被忽略,即充当一个只读视图。 |
sceneRect | 此视图显示的场景区域 |
backgroundBrush | 可以覆盖场景的背景 |
dragMode | 按下鼠标左键时在场景上拖动鼠标的行为,默认值NoDrag不起任何作用。 |
resizeAnchor | 调整视图大小时视图应如何定位场景,类型为ViewportAnchor。请注意,当只有场景的一部分可见时(即,当有滚动条时),此属性的效果是明显的。否则,如果整个场景适合视图,QGraphicsScene将使用属性alignment在视图中定位场景。 |
sceneRect | 类型为QRectF,如果该属性未设置或设置为null,则该属性值等于 QGraphicsScene的sceneRect,且随其值改变而改变。因此,如果想要实现固定大小的视图,则必须为该属性赋值。 |
函数
函数名 | 描述 |
---|---|
QGraphicsView(scene[, parent=None]) | 参数: scene – PySide6.QtWidgets.QGraphicsScene parent – PySide6.QtWidgets.QWidget |
它是PySide6中QGraphicsWidget体系的图元,通过场景(scene)管理并使用视图(view)显示它,它可以实现复杂的图形交互,甚至开发游戏。
除非有特殊需求,一把不推荐使用。