首页 > 其他分享 >图形视图体系结构——Graphics View

图形视图体系结构——Graphics View

时间:2023-07-31 15:23:16浏览次数:40  
标签:场景 QGraphicsScene 视图 坐标 Graphics QGraphicsItem 图元 View

Graphics View框架结构的特点、主要包含元素及坐标系统。

1、特点

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

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

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

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

2、三元素

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

Graphics View三元素之间的关系

  1. 场景类:QGraphicsScene类

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

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

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

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

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

  1. 视图类:QGraphicsView类

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

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

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

  1. 图元类:QGraphicsItem类

  它是场景中各个图元的基类,在它的基础上可以继承各种图元类,Qt已经预置的包括直线(QGraphicsLineItem)、椭圆(QGraphicsEllipseItem)、文本图元(QGraphicsTextItem)、矩形(QGraphicsRectItem)等。也可以在QGraphicsItem类的基础上实现自定义的图元类,即用户可以继承QGraphicsItem实现符合自己需求的图元。

QGraphicsItem主要有以下功能:

  • 处理鼠标按下、移动、释放、双击、悬停、滚轮和右键菜单事件。
  • 处理键盘输入事件。
  • 处理拖拽事件。
  • 分组。
  • 碰撞检测。

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

3、坐标系统

  QGraphics View坐标基于笛卡儿坐标系,一个图元的场景具有x坐标和y坐标。当使用没有变换的视图视察场景时,场景中的一个单元对应屏幕上的一个像素。

  三个QGraphics View基本类有各自不同的坐标系,场景坐标、视图坐标和图元坐标。QGraphics View提供了三个坐标系统之间的转换函数。在绘制图形时,QGraphics View的场景坐标对应QPainter的逻辑坐标、视图坐标和设备坐标。

  1. 场景坐标

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

  QGraphicsScene类的坐标系以中心为原点(0,0),如下图所示:

QGraphicsScene类的坐标系

  1. 视图坐标

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

  QGraphicsView类继承自QWidget类,因此它与其它的QWidget类一样,以窗口的左上角作为自己坐标系的远点,如下图所示: 

QGraphicsView类的坐标系

  1. 图元坐标

  图元使用自己的本地坐标,这个坐标系统通常以图元中心为原点,这也是所有变换的原点。图元坐标方向是x轴正方向向右,y轴正方向向下。创建图元后,只需注意图元坐标就可以,QGraphicsScene和QGraphicsView会完成所有的变换。

  QGraphicsItem类的坐标系,若在调用QGraphicsItem类的paint()函数重绘图元时,则以此坐标系为基准,如下图所示:

QGraphicsItem坐标系

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

标签:场景,QGraphicsScene,视图,坐标,Graphics,QGraphicsItem,图元,View
From: https://www.cnblogs.com/xionglaichuangyichuang/p/17593513.html

相关文章

  • DRF之APIView全笔记
    一.APIView基本视图,所有的都用这个来作viewsetmixin主要管as_view{}里的调配让视图不再需要两个类二.通用视图GenericAPIView(rest_framework.viewsets)GenericAPIView一共五个功能,数据库获取、分页、序列化、getobject\还有frilter_queryset__东西挺多的主要管self.get_object......
  • mongodb 创建视图
    MongoDB创建视图什么是MongoDB视图?MongoDB是一个非关系型数据库,它以文档的形式存储数据。通常,我们使用MongoDB中的集合(Collection)来存储和查询数据。但有时候,我们需要根据特定的查询条件创建一个虚拟的集合,这个虚拟的集合被称为视图(View)。视图是基于一个或多个集合的查询......
  • 【8.0】DRF之DRF视图扩展类
    【一】5个视图扩展类GenericAPIView+5个视图扩展类+序列化类+Response写接口【1】5个视图扩展类对应五个方法查询所有数据新增一条数据查询单条数据修改一条数据删除一条数据【2】写5个类的好处就是解耦合,提高代码的可扩展性这五个类不叫视图类,叫视图扩展......
  • 【六】DRF之视图组件
    【一】视图的主要作用DjangoRESTframwork提供的视图的主要作用:控制序列化器的执行(检验、保存、转换数据)控制数据库查询的执行【二】视图继承关系视图的方法与属性:【三】视图RESTframework提供了众多的通用视图基类与扩展类,以简化视图的编写。【1】2......
  • 09-索引和视图
    09-索引和视图课程目标掌握索引原理、索引的应用、视图的概念、创建视图、修改视图、删除视图。9.1索引原理索引被用来快速找出在一个列上某一特定值的行。没有索引,MySQL不得不首先以第一条记录开始,然后读完整个表直到它找出相关的行。表越大,花费时间越多。对于一个有序字段,可以......
  • Interview - 逻辑题思维导图
     一、社会结构个人父母/家庭学校/单位政府国家 例题:你认为TV的出现是好事么? 二、历史维度本国历史他国历史现实 例题:你认为应该按下技术按钮么?  参考文献桥水基金面试❗️奥义浓缩在20道题里https://www.xiaohongshu.com/explore/6367e3620000000007035ab......
  • 无涯教程-jQuery Interview Questions函数
    尊敬的读者,这些jQuery面试问题是专门设计的,目的是让您熟悉在您采访jQuery时可能遇到的问题的性质。根据我的经验,优秀的面试官几乎不会计划在面试过程中提出任何特定的问题,通常,问题是从该主题的一些基本概念开始的,然后根据进一步的讨论和您的回答继续进行讨论-Whatisj......
  • django(视图层)
    一、三板斧'''HttpResponse返回字符串类型render返回html页面,并且在返回给浏览器之前还可以给html文件传值redirect重定向'''#视图函数必须返回一个HttpResponse对象正确#看三者的源码(render和redirect继承HttpResponse类)Theviewapp01.views.in......
  • 解决QT QGraphicsView提升到QChartView报错的问题
    使用QT提供的QChartView来绘制图表,提升QGraphicsView控件继承QChartView后,然后将QGraphicsView提升到我们自己写的类,怎么才能确保提升后编译不报错呢。[问题描述]使用QGraphicsView显示图表的时候,我们需要将它提升为QChartView.但提升后再此运行一般会发生编译报错,错误发生在......
  • 使用StoryBoard设置Scrollview的横向滚动不用一行代码
    1).创建一个空工程Single类型的工程,然后打开故事版(StoryBoard)在ViewController上添加scrollview2).然后对scrollview添加约束,上下左右全部都是0就可以(注意:在添加上下左右约束的时候一定要取消Constraintomargins,否则添加完的约束会出现左右各缺少20像素的边距)3).添加完......