PySide (PyQt)的视图(QGraphicsView)和场景(QGraphicsScene)

         在 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():将视图坐标转换为屏幕上的像素坐标。

5. 视图的显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深蓝海拓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值