【Python_GraphicsView 学习笔记(一)】Graphics View框架的基本介绍
- 前言
- 正文
- 1、Graphics View框架简介
- 2、Graphics View框架与QPainter类的区别
- 3、Graphics View框架的三个组成部分
- 4、场景QGraphicsScene类
- 5、视图QGraphicsView类
- 6、图形项QGraphicsItem类
- 7、Graphics View框架的坐标系统
- 8、参考文章
前言
Qt提供了比较丰富的内置控件,可以满足常规的开发;如果想要使用自定义控件,Qt也提供了QPainter类画出各种各样的控件;但如果要绘制大量的控件或者图形,并进行相应的控制管理,如拖拽、旋转等操作时就会显得力不从心。还好Qt提供了Graphics View框架来对大量的自定义图形项进行管理与交互。
正文
本文中主要介绍什么是Graphics View框架,Graphics View框架与QPainter类的区别,Graphics View框架的三元素等;在学习Graphics View框架的过程中,发现Graphics View框架相关的文章都比较零散,因此决定将自己最近的学习进行总结记录。
1、Graphics View框架简介
Graphics View框架 是一个基于 item 的 model-view 架构 的框架,基于 item 是因为它的每一个组件都是一个 item。
Graphics View框架是一个典型的 model-view 架构,Graphics View框架提供了一个model和一个view。model是添加的各种对象,view就是观察这些对象的视口或窗口。同一个model可以由很多view从不同的角度进行观察。
2、Graphics View框架与QPainter类的区别
- QPainter绘图:QPainter 绘图多是采用一种面向过程的描述方式,需要在绘图设备的paintEvent()事件里编写绘图的程序,实现整个绘图过程,适合于绘制复杂性不高的固定图形,不能实现图件的选择,编辑,拖放,修改等功能。
- Graphics View框架:Graphics View 架构可以绘制复杂的有大量基本图形元件的图形,并且每个图形元件是可选择,可拖放和修改的,类似于矢量绘图软件的绘图功能。
3、Graphics View框架的三个组成部分
Graphics View架构主要由三个部分组成,即场景QGraphicsScene、视图QGraphicsView、图形项QGraphicsItem;
其中,场景类QGraphicsScene 提供了一个用于管理位于其中的众多图形项QGraphicsItem,视图类QGraphicsView 用于显示场景中的图形项QGraphicsItem,一个场景可以通过多个视图表现,一个场景包括多个图形项。
- QGraphicsScene类 提供绘图场景(scene);场景是不可见的,是一个抽象的管理图形项的容器,可以向场景添加图形项,获取场景中的某个图形项等。
- QGraphicsView类 提供绘图的视图(view)组件,用于显示场景中的内容;可以为一个场景设置几个视图,用于对同一个数据集提供不同的视口。
- QGraphicsItem类 是场景中所有物件的基类,GraphicsView也提供了一些标准item,例如矩形QGraphicsRectItem,椭圆QGraphicsEllipseItem等。
这三个类的关系:
注意:
- 场景QGraphicsScene 和里面包含的 图形项QGraphicsItem 作为 model, 视图QGraphicsView 作为 view;
- model里面存储了要展示的界面的数据定义, 而view根据 model里面的数据进行展示;
- 一个model可以对应多个view。
界面的显示关系:
4、场景QGraphicsScene类
QGraphicsScene是一个图形项的集合,它包括三层:背景层background layer, 项层item layer 和前景层foreground layer。
可以通过重新实现drawBackground() drawForeground() 来控制背景层和前景层。
场景QGraphicsScene主要具有如下一些功能:
- 提供管理大量图形项的快速接口;
- 将事件传播给每个图形项;
- 管理每个图形项的状态,例如选择状态,焦点状态等;
- 管理未经变换的渲染功能,主要用于打印。
5、视图QGraphicsView类
QGraphicsView:可以为一个场景设置几个视图,用于对同一个数据集提供不同的视口。当视图比场景大时,会显示场景中的所有内容,当视图比场景小时则只能显示场景的一部分内容,但是会自动提供卷滚条在整个场景内移动。
6、图形项QGraphicsItem类
QGraphicsItem支持以下的一些操作:
- 处理鼠标按下、移动、释放、双击、悬停、滚轮和右键菜单事件;
- 支持键盘输入,按键事件;
- 处理拖曳事件;
- 支持组合,可以是父子项关系组合,也可以通过QGraphicsItemCroup类进行组合;
- 碰撞检测。
7、Graphics View框架的坐标系统
- 视图坐标:与设备坐标相同,是物理坐标,一般以左上角为原点,单位是像素;视图的坐标只与widget或者视口有关,而与场景无关,所有的鼠标事件、拖放事件的坐标首先是由视图坐标定义的,然后用户需要将这些坐标映射成场景坐标,以便程序中交互;
- 场景坐标:等价于QPainter的逻辑坐标,一般以场景的中心为原点,单位是像素;场景是所有图形项的基础坐标,描述了每个顶层图形项的位置;
- 图形项坐标:局部逻辑坐标,一般以图件的中心为原点;每个图形项在场景里都有一个位置坐标,是由QGraphicsItem::scenePos给出的。
8、参考文章
- 项目实战4-工控系统前端
- QT之图形视图框架概述——Graphics View Framework
- 74 QT图形视图框架(Graphics View)
- Qt Graphics View 框架