08-3_Qt 5.9 C++开发指南_Graphics View绘图架构

文章目录

  • 1. 场景、视图与图形项
    • 1.1 场景
    • 1.2 视图
    • 1.3 图形项
  • 2. Graphics View 的坐标系统
    • 2.1 图形项坐标
    • 2.2 视图坐标
    • 2.3 场景坐标
    • 2.4 坐标映射
  • 3. Graphics View 相关的类
    • 3.1 QGraphicsView 类的主要接口函数
    • 3.2 QGraphicsScene 类的主要接口函数
    • 3.3 图形项
  • 4. 实例介绍

1. 场景、视图与图形项

采用QPainter 绘图时需要在绘图设备的 paintEvent()事件里编写绘图的程序,实现整个绘图过程。这种方法如同使用 Windows 的画图软件在绘图,绘制的图形是位图,这种方法适合于绘制复杂性不高的固定图形,不能实现图件的选择、编辑、拖放、修改等功能。

Qt 为绘制复杂的可交互图形提供了 Graphics View 绘图架构,是一种基于图形项(Graphics Item)的模型/视图模式,与第5 章的数据编辑与显示的 Model/View 模式类似。使用Graphics View架构可以绘制复杂的有几万个基本图形元件的图形,并且每个图形元件是可选择、可拖放和修改的,类似于矢量绘图软件的绘图功能。
Graphics View 架构主要由3 个部分组成,即场景视图图形项,其构成的 Graphics View绘图系统结构如图8-16 所示。

在这里插入图片描述

1.1 场景

QGraphicsScene 类提供绘图场景 (Scene)。场景是不可见的,是一个抽象的管理图形项的容器,可以向场景添加图形项,获取场景中的某个图形项等。场景主要具有如下一些功能:

  • 提供管理大量图形项的快速接口;
  • 将事件传播给每个图形项;
  • 管理每个图形项的状态,例如选择状态、焦点状态等;
  • 管理未经变换的渲染功能,主要用于打印。

除了图形项之外,场景还有背景层和前景层,通常由 QBrush 指定,也可以通过重新实现drawBackground()和 drawForeground()函数来实现自定义的背景和前景,实现一些特殊效果。

1.2 视图

QGraphicsView 提供绘图的视图 (View)组件,用于显示场景中的内容。可以为一个场景设置几个视图,用于对同一个数据集提供不同的视口。

在图 8-16 中,虚线框的部分是一个场景,视图1比场景大,显示场景的全部内容。缺省情况下,当视图大于场景时,场景在视图的中间部分显示,也可以设置视图的 Alignment 属性控制场景在视图中的显示位置;当视图小于场景时(见图 8-16 中的视图 2),视图只能显示场景的一部分内容,但是会自动提供卷滚条在整个场景内移动。

视图接收键盘和鼠标输入并转换为场景事件,并进行坐标转换后传送给可视场景。

1.3 图形项

图形项(Graphics Item)就是一些基本的图形元件,图形项的基类是 OGraphicsItem。Ot 提供了一些基本的图形项,如绘制椭圆的 QGraphicsEllipseltem、绘制矩形的QGraphicsRectItem、绘制文字的QGraphicsTextItem 等。
QGraphicsItem 支持如下的一些操作:

支持鼠标事件响应,包括鼠标按下、移动、释放、双击,还包括鼠标停留、滚轮、快捷菜单等事件;

支持键盘输入,按键事件;
支持拖放操作;
支持组合,可以是父子项关系组合,也可以是通过 QGraphicsItemGroup 类进行组合。

所以,图形项可以被选择、拖放、组合,若编写信号槽函数代码,还可以实现各种编辑功能。一个图形项还可以包含子图形项,图形项还支持碰撞检测,即是否与其他图形项碰撞。

在图 8-16 所示的视图、场景和图形项之间的关系示意图中,场景是图形项的容器,可以在场景上绘制很多图形项,每个图形项就是一个对象,这些图形项可以被选择、拖动等。视图是显示场景的一部分区域的视口,一个场景可以有多个视图,一个视图显示场景的部分区域或全部区域,或从不同角度观察场景

2. Graphics View 的坐标系统

Graphics View 系统有3 个有效的坐标系,图形项坐标、场景坐标、视图坐标。3 个坐标系的示意图如图8-17 所示。绘图的时候,场景的坐标等价于QPainter的逻辑坐标,一般以场景的中心为原点;视图坐标与设备坐标相同,是物理坐标,缺省以左上角为原点;图形项坐标是局部逻辑坐标,一般以图件的中心为原点。

在这里插入图片描述

2.1 图形项坐标

图形项使用自己的局部坐标 (Item Coordinates),通常以其中心为(0,0),也是各种坐标变换的中心。图形项的鼠标事件的坐标是用局部坐标表示的,创建自定义图形项,绘制图形项时只需考虑其局部坐标,QGraphicsScene 和 QGraphicsView 会自动进行坐标转换。

一个图形项的位置是其中心点在父坐标系统中的坐标,对于没有父图形项的图形项,其父对象就是场景,图形项的位置就是在场景中的坐标。
如果一个图形项还是其他图形项的父项,父项进行坐标变换时,子项也做同样的坐标变换。

QGraphicsItem 的大多数函数都是在其局部坐标系上操作的,例如一个图形项的边界矩形QGraphicsItem:boundingRect()是用局部坐标给出的,但是 QGraphicsItem::pos()是仅有的几个例外,它返回的是图形项在父项坐标系中的坐标,如果是顶层图形项,就是在场景中的坐标。

2.2 视图坐标

视图坐标(View Coordinates)就是窗口界面(widget)的物理标,单位是像素。视图坐标只与 widget 或视口有关,而与观察的场景无关。QGraphicsView 视口的左上角坐标总是 (0.0)。

所有的鼠标事件、拖放事件的坐标首先是由视图坐标定义的,然后用户需要将这些坐标映射为场景坐标,以便和图形项交互。

2.3 场景坐标

场景是所有图形项的基础坐标,场景坐标(Scene Coordinates)描述了每个顶层图形项的位置,创建场景时可以定义场景矩形区的坐标范围,例如
scene=new QGraphicsScene(-400,-300,800,600);

这样定义的 scene 是左上角坐标为(-400,-300),宽度为 800,高度为 600 的矩形区域,单位是像素。

每个图形项在场景里都有一个位置坐标,由函数QGraphicsItem::scenePos()给出;还有一个图形项边界矩形,由QGraphicsItem;:sceneBoundingRect()函数给出。边界矩形可以使 QGraphicsScene知道场景的哪个区域发生了变化。场景发生变化时会发射 QGraphicsScene::changed()信号,参数是一个场景的矩形列表,表示发生变化的矩形区。

2.4 坐标映射

在场景中操作图形项时,进行场景到图形项、图形项到图形项,或视图到场景之间的坐标变换是比较有用的,即坐标映射(Coordinate Mapping)。例如,在 QGraphicsView 的视口上单击鼠标时,通过函数 QGraphicsView::mapToScene()可以将视图标映射为场景坐标,然后用QGraphicsScene::itemAt()函数可以获取场景中鼠标光标处的图形项。

3. Graphics View 相关的类

Graphics View 结构的主要类包括视图类 QGraphicsView、场景类QGraphicsScene,和各种图形项类,图形项类的基类都是 QGraphicsItem。

3.1 QGraphicsView 类的主要接口函数

QGraphicsView 是用于观察一个场景的物理窗口,当场景小于视图时,整个场景在视图中可见;当场景大于视图时,视图自动提供卷滚条。
QGraphicsView 的视口坐标等于显示设备的物理坐标,但是也可以对 QGraphicsView 的坐标进行平移、旋转、缩放等变换。

对应章节表中是QGraphicsView 的主要接口函数。一般的设置函数还有一个对应的读取函数,如 setScene0对应的读取函数是 scene(),这里只列出设置函数。并且仅列出函数的返回数据类型,省略了输入参数,函数的详细定义见 Qt 帮助文件。

3.2 QGraphicsScene 类的主要接口函数

QGraphicsScene 是用于管理图形项的场景,是图形项的容器,有添加、删除图形项的函数管理图形项的各种函数。对应接口函数介绍见对应章节。

3.3 图形项

QGraphicsItem 是所有图形项的基类,用户也可以从QGraphicsItem 继承定义自己的图形项Qt 定义了一些常见的图形项,这些常见的图形项的类的继承关系如图 8-18 所示。

在这里插入图片描述

4. 实例介绍

具体实例介绍见对应章节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/85616.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2023 华数杯全国大学生数学建模竞赛】 C题 母亲身心健康对婴儿成长的影响 45页论文及python代码

【2023 华数杯全国大学生数学建模竞赛】 C题 母亲身心健康对婴儿成长的影响 45页论文及python代码 1 题目 母亲是婴儿生命中最重要的人之一,她不仅为婴儿提供营养物质和身体保护, 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c…

Java线程池

线程池 1. 概念2. 工作流程3. ThreadPoolExecutor参数 1. 概念 线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁…

在pycharm中使用Git上传代码到Gitee/GitHub(适合新手小白的超级详细步骤讲解)

目录 一、在pycharm中下载gitee/github插件二、注册自己的Gitee / Githhub账号三、创建仓库三、选择想要上传的代码文件四、修改代码后上传到Gitee/GitHub 因为Gitee和GitHub使用方法差不多,所以本文以将代码上传到Gitee为例,GitHub操作类似。 一、在py…

vivado tcl创建工程和Git管理

一、Tcl工程创建 二、Git版本管理 对于创建完成的工程需要Git备份时,不需要上传完整几百或上G的工程,使用tcl指令创建脚本,并只将Tcl脚本上传,克隆时,只需要克隆tcl脚本,使用vivado导入新建工程即可。 优…

【机器学习2】什么是Jupyter notebook 新手使用Jupter notebook

什么是Jupyter notebook? Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。 Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享程序文档,支持实时代码&#x…

list的使用和模拟实现

目录 1.list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 2.为什么使用迭代器? 3.list的模拟实现 3.1完整代码 3.2代码解析 4.list与…

大数据-玩转数据-Flink-Transform

一、Transform 转换算子可以把一个或多个DataStream转成一个新的DataStream.程序可以把多个复杂的转换组合成复杂的数据流拓扑. 二、基本转换算子 2.1、map(映射) 将数据流中的数据进行转换, 形成新的数据流,消费一个元素并产出一个元素…

iOS开发-WebRTC本地直播高分辨率不显示画面问题

iOS开发-WebRTC本地直播高分辨率不显示画面问题 在之前使用WebRTC结合ossrs进行推流时候,ossrs的播放端无法看到高分辨率画面问题。根据这个问题,找到了解决方案。 一、WebRTC是什么 WebRTC是什么呢? WebRTC (Web Real-Time Communicatio…

【学习FreeRTOS】第4章——FreeRTOS任务创建与删除

1.任务创建和删除的API函数 任务的创建和删除本质就是调用FreeRTOS的API函数 动态方式创建任务——xTaskCreate()静态方式创建任务——xTaskCreateStatic()删除任务——vTaskDelete() 动态创建任务:任务的任务控制块以及任务的栈空间所需的内存,均由 F…

[Kubernetes]Kubeflow Pipelines - 基本介绍与安装方法

1. 背景 近些年来,人工智能技术在自然语言处理、视觉图像和自动驾驶方面都取得不小的成就,无论是工业界还是学术界大家都在惊叹一个又一个的模型设计。但是对于真正做过算法工程落地的同学,在惊叹这些模型的同时,更多的是在忧虑如…

【论文阅读】Deep Instance Segmentation With Automotive Radar Detection Points

基于汽车雷达检测点的深度实例分割 一个区别: automotive radar 汽车雷达 : 分辨率低,点云稀疏,语义上模糊,不适合直接使用用于密集LiDAR点开发的方法 ; 返回的物体图像不如LIDAR精确,可以…

Redis追本溯源(四)集群:主从模式、哨兵模式、cluster模式

文章目录 一、主从模式1.主从复制——全量复制2.主从复制——增量复制 二、哨兵模式1.实时监控与故障转移2.Sentinel选举领导者 三、cluster模式1.三种分片方案2.cluster模式 Redis 有多种集群搭建方式,比如,主从模式、哨兵模式、Cluster 模式。 一、主…

15.4 【Linux】可唤醒停机期间的工作任务

15.4.1 什么是 anacron anacron 并不是用来取代 crontab 的,anacron 存在的目的就在于我们上头提到的,在处理非24 小时一直启动的 Linux 系统的 crontab 的执行! 以及因为某些原因导致的超过时间而没有被执行的调度工作。 其实 anacron 也是…

DERT:End-to-End Object Detection with Transformers

文章目录 摘要1、简介2、相关工作2.1、集合预测2.2、Transformer与并行解码2.3、目标检测 3、DETR模型3.1、目标检测集合预测损失3.2、DETR架构 4、实验4.1、与Faster R-CNN的对比4.2、消融4.3、分析4.4、用于全景分割的DETR 5、结论附录 AA.1、初步:多头注意层A.2、损失A.3、详…

Attacks in NLP

一、 Introduction NLP对抗攻击是人工智能对抗攻击的一个重要的组成部分,但是最近几年才逐渐开始兴起,究其原因在于NLP对抗攻击与传统computer vision或者audio对抗攻击有很大的不同,主要在于值空间的连续性(CV、audio&#xff0…

SpringCloud整体架构概览

什么是SpringCloud 目标 协调任何服务,简化分布式系统开发。 简介 构建分布式系统不应该是复杂的,SpringCloud对常见的分布式系统模式提供了简单易用的编程模型,帮助开发者构建弹性、可靠、协调的应用程序。SpringCloud是在SpringBoot的基…

【Wamp】安装 | 局域网内设备访问

安装教程: https://wampserver.site/article/1.html 下载 https://www.wampserver.com/en/ 安装路径上不能有中文 安装好之后图标呈绿色 放入网页文件 将网页文件放置于wamp文件夹的www子文件夹 例如:\Wamp\program\www 修改http端口 WAMP服务器…

C# 使用FFmpeg.Autogen对byte[]进行编解码

C# 使用FFmpeg.Autogen对byte[]进行编解码,参考:https://github.com/vanjoge/CSharpVideoDemo 入口调用类: using System; using System.IO; using System.Drawing; using System.Runtime.InteropServices; using FFmpeg.AutoGen;namespace F…

虚拟世界探索:科技之下的未来可能性

随着科技的飞速发展,人们对于虚拟世界的憧憬和探索也日益加深。虚拟世界,那是一个超越现实的概念,一个充满想象力和创造力的领域。然而,虚拟世界究竟有可能实现吗?这是一个引人深思的问题。 虚拟世界,首先让…

激光切割机的操作中蛙跳技术是什么意思

其实,蛙跳技术就是指在激光切割机运行的过程中,机器换位置的方式。打个比方,你刚刚在这儿把孔1切好了,接下来就得跑到那儿把孔2切了。 在这个过程中,激光切割机就像是一只青蛙,要从一个位置跳到另一个位置。…