QT5图形视图框架

QT5图形视图框架

图形视图体系结构

GraphicsView (图形视图)框架结构取代了之前版本中的QCanvas模块,它提 供基于图元的模型/视图编程,类似于QtlnterView的模型/视图结构,只是这里的数据是图形。

GraphicsView 的特点

Graphics View框架结构的主要特点如下。

(1) Graphics View框架结构中,系统可以利用Qt绘图系统的反锯齿、OpenGL 工具来改善绘图性能。

(2) Graphics View支持事件传播体系结构,可以使图元在场景(scene)中的 交互能力提高一倍,图元能够处理键盘事件和鼠标事件。其中,鼠标事件包括鼠标 按下、移动、释放和双击,还可以跟踪鼠标的移动。

(3 )在 Graphics View 框架中,通过二元空间划分树(Binary Space Partitioning, BSP)提供快速的图元查找,这样就能够实时地显示包含上百万个 图元的大场景。

Graphics View 的三元素

Graphics View框架结构主要包含三个类,场景类(QGraphicsScene)、视图类 (QGraphicsView)和图元类(QGraphicsItem),统称为"三元素”。其中,场景类提 供了一个用于管理位于其中的众多图元容器,视图类用于显示场景中的图元,一个 场景可以通过多个视图表现,一个场景包括多个几何图形。它们三者之间的关系如 图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pvQt9T20-1664354665656)(C:\Users\star\Desktop\LearnC++\learn-c\QT应用开发\pic\GraphView三元素.png)]

(1) 场景类:QGraphicsScene类

它是一个用于放置图元的容器,本身是不可见的,必须通过与之相连的视图类 来显示及与外界进行互操作。通过QGraphicsScene::addltem()可以添加一个图元到 场景中。图元可以通过多个函数进行检索。QGraphicsScene::items()和一些重载函数 可以返回和点、矩形、多边形或向量路径相交的所有图元。QGraphicsScene::itemAt() 返回指定点的最顶层图元。

场景类主要完成的工作包括,提供对它包含的图元的操作接口和传递事件,管 理各个图元的状态(如选择和焦点处理),提供无变换的绘制功能(如打印)等。

事件传播体系结构将场景事件发送给图元,同时也管理图元之间的事件传播。 如果场景接收到了在某一点的鼠标单击事件,场景会将事件传给在这一点的图元。

管理各个图元的状态(如选择和焦点处理)。可以通过 QGraphicsScene::setSelectionArea()函数选择图元,选择区域可以是任意的形状,使 用QPainterPath表示。若要得到当前选择的图元列表,则可以使用函数 QGraphicsScene::selectedltems()□可以通过 QGraphicsScene:: setFocusItem()函数或 QGraphicsScene::setFocus()函数来设置图元的焦点,获得当前具有焦点的图元使用 函数 QGraphicsScene::focusltem()。

如果需要将场景内容绘制到特定的绘图设备,则可以使用 QGraphicsScene: :render()函数在绘图设备上绘制场景。

(2) 视图类:QGraphicsView 类

它提供一个可视的窗口,用于显示场景中的图元。在同一个场景中可以有多个 视图,也可以为相同的数据集提供几种不同的视图。

QGraphicsView是可滚动的窗口部件,可以提供滚动条来浏览大的场景。如果 需要使用OpenGL ,则可以使用QGraphicsView::setViewport()将视图设置为 QGLWidgeto

视图接收键盘和鼠标的输入事件,并将它们翻译为场景事件(将坐标转换为场 景的坐标)。使用变换矩阵函数QGraphicsView::matrix()可以变换场景的坐标,实现 场景缩放和旋转。QGraphicsView 提供 QGraphicsView::mapToScene()和 QGraphicsView:: mapFromScene()用于与场景的坐标进行转换。

(3) 图元类:QGraphicsItem 类

它是场景中各个图元的基类,在它的基础上可以继承出各种图元类,Qt已经预 置的包括直线(QGraphicsLineltem )、椭圆(QGraphicsEllipseltem )、文本图元 (QGraphicsTextltem)> 矩形(QGraphicsRectltem)等。当然,也可以在 QGraphicsItem 类的基础上实现自定义的图元类,即用户可以继承QGraphicsItem实现符合自己需 要的图元。

QGraphicsItem主要有以下几点功能。

•处理鼠标按下、移动、释放、双击、悬停、滚轮和右键菜单事件。

•处理键盘输入事件。

•处理拖曳事件。

•分组。

•碰撞检测。

此外,图元有自己的坐标系统,也提供场景和图元。图元还可以通过 QGraphicsItem:: matrix()来进行自身的交换,可以包含子图元。

Graphics View 的坐标系统

  1. 场景坐标

场景坐标是所有图元的基础坐标系统。场景坐标系统描述了顶层的图元,每个 图元都有场景坐标和相应的包容框。场景坐标的原点在场景中心,坐标原点是X轴 正方向向右,y轴正方向向下。

  1. 视图坐标

视图坐标是窗口部件的坐标。视图坐标的单位是像素。QGraphicsView视图的 左上角是(0,0), X轴正方向向右,丫轴正方向向下。所有的鼠标事件最开始都是 使用视图坐标。

QGraphicsView类继承自QWidget类,因此它与其他的QWidget类一样,以窗 口的左上角作为自己坐标系的原点。

  1. 视图坐标

视图坐标是窗口部件的坐标。视图坐标的单位是像素。QGraphicsView视图的 左上角是(0,0), X轴正方向向右,丫轴正方向向下。所有的鼠标事件最开始都是 使用视图坐标。

QGraphicsView类继承自QWidget类,因此它与其他的QWidget类一样,以窗 口的左上角作为自己坐标系的原点。

根据需要,Qt提供了这三个坐标系之间的互相转换函数,以及图元与图元之间 的转换函数,若需从QGraphicsItem坐标系中的某一点坐标转换到场景中的坐标, 则可调用QGraphicsItem的mapToScene()函数进行映射。而QGraphicsItem的 mapToParent()函数则可将QGraphicsItem坐标系中的某点坐标映射至它的上一级坐 标系中,有可能是场景坐标,也有可能是另一个QGraphicsItem坐标。

Graphics View框架提供了多种坐标变换函数

映射函数转换类型
QGraphicsView: :mapToScene()视图到场景
QGraphicsView: :mapFromScene()场景到视图
QGraphicsItem:: mapFromScene()场景到图元
QGraphicsItem:: mapToScene()图元到场景
QGraphicsItem:: mapToParent()子图元到父图元
QGraphicsItem:: mapFromParent()父图元到子图元
QGraphicsItem:: mapToItem()本图元到其他图元
QGraphicsItem:: mapFromItem()其他图元到本图元

QT日常专栏会使用一个例子详细介绍该模块。请关注QT日常专栏更新状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

turbolove

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

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

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

打赏作者

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

抵扣说明:

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

余额充值