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

news2024/10/2 20:24:37

文章目录

  • 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.coloradmin.cn/o/864955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CI+JUnit5并发单测机制创新实践

目录 一. 现状问题 二. 分析原因 三. 采取措施 四. 实践步骤 五. 效能提升 资料获取方法 一. 现状问题 针对现如今高并发场景的业务系统,“并发问题” 终归是必不可少的一类(占比接近10%),每次出现问题和事故后&#xff0c…

【C++】const_cast基本用法(详细讲解)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

华熙生物肌活:2023年版Bio-MESO肌活油性皮肤科学护肤指南

关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 以悦己和尝鲜为消费动机的他们,已迅速崛起成为护肤行业的焦点人群。而在新生代护肤议题中,“油性皮肤护理”已经成为一个至关重要的子集。今天,中国新生代人口数量…

通讯协议036——全网独有的OPC HDA知识一之聚合(五)计数

本文简单介绍OPC HDA规范的基本概念,更多通信资源请登录网信智汇(wangxinzhihui.com)。 本节旨在详细说明HDA聚合的要求和性能。其目的是使HDA聚合标准化,以便HDA客户端能够可靠地预测聚合计算的结果并理解其含义。如果用户需要聚合中的自定义功能&…

NZ系列工具NZ01:64位系统VBA二维码应用技术

【分享成果,随喜正能量】汗水能浇出成功的鲜花,拼搏能赢来胜利的喜悦,人生不易,累也过,闲也过,只要能充实就是最好过,有也过,没也过,为什么你不看看众生怎么过&#xff0…

从零到精通:学习这些R语言必学包成为数据分析高手!

一、操作数据 ❝ tidyverse ❞ tidyverse是一个强大的R语言数据分析工具集,包含了多个核心包。其中包括ggplot2用于数据可视化、dplyr用于数据处理和转换、tidyr用于数据整理和重塑、readr用于数据导入和读取、purrr用于函数式编程、stringr用于字符串处理等。 ❝ d…

同步_异步请求和Ajax并利用axios框架简化

目录 同步和异步 原生的Ajax 创建XMLHttpRequest对象 常用方法 常用属性 axios框架 同步和异步 同步请求:发送请求后,会做出回应,回应的内容会覆盖浏览器中的内容,这样会打断其他正常的操作,显得不太友好&#…

造个轮子-任务调度执行小框架-任务执行器代理实现

文章目录 前言执行器代理代理对象任务清单代理对象任务清单执项对象处理handler对象状态对象代理工厂任务清单代理工厂清单任务项代理工厂总结前言 不知道为啥,今天好像学不进去,没办法,那就继续编码吧。那么今天的话,加更一篇文章,那就是咱们这个任务执行器的实现。先前…

ESP-IDF插件去除红色波浪线

如图,新装的ESP-IDF打开别人的工程有好多红色波浪线。 把这里的第一个文件夹删除,就是那个.vscode,接下来按ctrlshiftP,输入vscode, 选第一个,添加配置文件夹。 问题解决。 之后记得重新配置板子信息和串…

【C++】static_cast基本用法(详细讲解)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

ffmepg滤镜

视频按顺时针方向旋转90度 ffplay -vf transpose1 -i juren-30s.mp4 ffplay -f lavfi -i testsrc -vf transpose1 -f lavfi -i testsrc这个滤镜是ffmpeg给用户的一个测试使用的视频 视频水平翻转(左右翻转) -vf hflip 实现慢速播放,声音速度是原始速度的50% ffpla…

pycharm,VSCode 几个好用的插件

pycharm Tabnine AI Code 可以在编写程序的时候为你提供一些快捷方式,增加编程速度 Chinese 对英文不好的程序员来说是个不错的选择,可以将英文状态下的pycharm变为中文版的 ChatGPT 可以跟ai聊天,ai可以解决你80%的问题 ,也可以帮…

10个AI绘图生成器让绘画更简单

AI不仅影响商业和医疗保健等行业,还在创意产业中发挥着越来越大的作用,开创了AI绘画生成器新时代。在绘画领域当然也是如此,与传统的绘画工具不同,AI人工智能时代的绘画工具是全自动的、智能的,甚至可以说是“傻瓜式”…

nginx负载均衡的几种配置方式介绍

一.负载均衡含义简介 二.nginx负载均衡配置方式 准备三台设备: 2.190均衡服务器,2.191web服务器1,2.160web服务器2,三台设备均安装nginx,两台web服务器均有网页内容 1.一般轮询负载均衡 (1&#xff09…

CMake: 检测并使用OpenMP的并行环境

CMake: 检测OpenMP的并行环境 导言OpenMP简介项目结构CMakeLists.txt相关源码输出结果 导言 目前,市面上的计算机几乎都是多核机器,对于性能敏感的程序,我们必须关注这些多核处理器,并在编程模型中使用并发。OpenMP是多核处理器上…

重零搭建SpringSecurity +JWT

1、前期工作(创建父工程,导入依赖) 2、创建启动类 3、测试项目,启动后访问8080端口、hello看有没有页面 4、引入springSecurity依赖(重新启动,再访问/hello,会跳转到登录页面,用户名是 user,密码…

系统集成项目管理工程师好考吗?不报班能考过吗?

即使不参加培训班,只要自我控制能力还不错,也可以通过考试。中级集成考试难度不大,主要是要理解47个过程的输入输出和工具的使用,很多题目都是按照这个逻辑出的。建议可以在网上或者刷题APP上找一些资料和真题来练习,因…

Ajax 笔记(二)—— Ajax 案例

笔记目录 2. Ajax 综合案例2.1 案例一-图书管理2.1.1 渲染列表2.1.2 新增图书2.1.3 删除图书2.1.4 编辑图书 2.2 案例二-背景图的上传和更换2.2.1 上传2.2.2 更换 2.3 案例三-个人信息设置2.3.1 信息渲染2.3.2 头像修改2.2.3 信息修改2.3.4 提示框 Ajax 笔记: Ajax…

全新 – Amazon EC2 M1 Mac 实例

去年,在 re: Invent 2021 大会期间,我写了一篇博客文章,宣布推出 EC2 M1 Mac 实例的预览版。我知道你们当中许多人请求访问预览版,我们尽了最大努力,却无法让所有人满意。不过,大家现在已经无需等待了。我很…

【C语言】实现通讯录(动态+文件)

目录 前言:一.创建多文件二.保存人的通讯录信息三.构建菜单 - test.c四.函数的声明五.函数的实现1.初始化通讯录2.增加指定联系人3.删除指定联系人4.查找指定联系人5.修改指定联系人6.排序联系人信息(排序名字)7.清理通讯录8.文件存盘 六.全部…