在 PySide 或 PyQt 中,QGraphicsView 和 QGraphicsScene 是两个重要的类,它们一起构成了一个强大的框架,用于显示和操作二维图形项(如图像、线条、矩形、文本等)。
1. 场景(QGraphicsScene
)的作用
- 场景是一个无限大的二维平面,可以理解为一个“画布”,用于管理和存储所有的图形项(
QGraphicsItem
)。 - 场景负责管理图形项的生命周期、事件处理、碰撞检测等底层逻辑。
- 场景不直接负责显示图形项,而是将这些任务交给视图(
QGraphicsView
)。
场景的特点:
- 无限大:场景的大小没有物理限制,因此可以容纳任意多的图形项。
- 事件处理:场景会处理底层的事件(如鼠标点击、键盘输入等),并将这些事件传递给相应的图形项。
- 管理图形项:场景负责添加、删除、查找和操作图形项。
场景的常见用法:
- 添加图形项:
scene.addItem(item)
- 获取图形项:
scene.items()
- 处理事件:
scene.mousePressEvent()
2. 视图(QGraphicsView
)的作用
- 视图是一个窗口或控件,用于显示场景的内容。它可以理解为一个“窗口”,用户通过视图来查看和操作场景中的图形项。
- 视图提供了一些高级功能,比如滚动、缩放、旋转、剪裁等,以便用户更好地查看和操作场景中的内容。
- 视图与场景的关系是“一对多”的,即一个场景可以被多个视图同时显示。
- 视图中的场景是唯一的,可以通过
setScene()
方法将另一个场景分配给视图,但这将替换已有的场景。
视图的特点:
- 有限的显示区域:视图有一个可见的矩形区域(viewport),它决定了场景的哪些部分会被显示。
- 坐标转换:视图负责将视图坐标和场景坐标之间进行转换(例如,
mapToScene()
和mapFromScene()
)。 - 交互功能:视图可以处理用户的交互(如鼠标滚动、缩放等),并将其反映到场景中。
视图的常见用法:
- 设置场景:
view.setScene(scene)
- 缩放视图:
view.scale(x, y)
- 获取当前视图的中心点:
view.mapToScene(view.viewport().rect().center())
3. 视图与场景的关系
- 场景是内容的容器:场景负责存储和管理所有的图形项,但它不直接负责显示这些图形项。
- 视图是显示的窗口:视图负责将场景中的内容渲染到屏幕上,并提供用户交互功能。
- 场景和视图是分离的:场景和视图的设计是分离的,这样可以实现更灵活的布局和显示方式。例如,一个场景可以同时被多个视图显示,每个视图可以有不同的缩放比例或视角。
4. 坐标系统的区别
- 场景坐标:场景坐标是全局坐标系统,图形项的位置和大小都是相对于场景的左上角((0, 0))来定义的。
- 视图坐标:视图坐标是相对于视图的可见区域(viewport)的坐标系统。视图坐标通常会受到视图的缩放、平移等操作的影响。
- 像素坐标:像素坐标是物理屏幕上的坐标系统,通常用于处理用户输入事件。
坐标转换:
mapToScene()
:将视图坐标转换为场景坐标。mapFromScene()
:将场景坐标转换为视图坐标。mapToGlobal()
:将视图坐标转换为屏幕上的像素坐标。