Graphics View框架中三个重要的类:QGraphicsScene, QGraphicsView,  QGraphicsItem。

Scene提供了图形视图场景,它是整个框架的基础,负责以下四个事情:

1.为了管理大量元素item,它提供了一个快速的接口

2.传播事件给每一个元素item

3.管理元素item状态,例如选择和焦点处理

4.提供原生的渲染功能,主要用于绘图。

Scene场景充当一个QGraphicsItem对象,可以使用addItem()函数将元素item添加到场景中,场景负责管理添加到自身的元素,比如传播事件等。可以把Scene想象成一个管理器,统一管理它旗下的元素item。

View视图主要作为场景中的视图组件,它将场景中的内容展现在我们的眼前。同时它还负责接收来自键盘和鼠标的输入事件,然后将事件转换成场景事件然后传播给Scene。

Item元素是场景中基础组件,它被添加到场景中,然后被View视图显示出来。描述元素主要利用一些属性,

shape()函数返回元素的轮廓图,如果我们定义了一个类继承QGraphicsItem,那么我们就需要实现shape()函数返回这个类表示的元素的轮廓图(为了画出一个东西,首先当然要知道它的轮廓图,或者说形状是什么样子嘛,不然谁知道怎么画。。。)。shape()函数返回的是QPainterPath类型,用于表示外围轮廓。

boundingRect()函数则返回包围元素的最小矩形,用于Scene判断哪个区域发生了改变。

此外,QGraphicsItem类自带碰撞检测,这就为元素之间的相互作用提供了很大的方便。因为我们每创建一个元素,就需要使用addItem函数将其添加到Scene中,所以就可以使用QGraphicsItem::collidesWith()函数来返回所有在Scene中与该元素发生碰撞的元素。

除此之外,就是三者的坐标系统,一旦决定使用Graphics View框架,就注定要与三者的坐标变换奋斗。

首先考虑元素的坐标系统,Item Coordinates:

元素的坐标系统(坐标系)是以元素为原点绘制的,也就是说通常元素的位置都是坐标原点(0, 0),前面说的bounding rect 和shape都是在元素坐标系统中确定的。而我们通常说的元素位置坐标,是在场景Scene坐标系中定义的。

打个比方,元素坐标为(10, 0),那么它在Scene中的坐标就是(10, 0)。然后又给出在元素中的坐标(0, 10),那么在Scene中,这个坐标就是(10, 10)。

场景的坐标系统,Scene Coordinates:

场景坐标系主要用于描述元素的位置。正如前面说的元素坐标其实是在场景坐标系中确定的。

视图的坐标系统,View Cooridinates:

视图的坐标系总是以视图的左上角为原点,右下角的坐标总是(width, height)。所有的鼠标事件和拖放事件的坐标都是在视图坐标系中给定的。所以需要我们将这个坐标转换成场景坐标来响应元素。

接下来是坐标变换,Coordinate Mapping:

通常在处理场景中的元素时,我们需要将坐标或者将几何图形从场景坐标转换到元素坐标系下,或者从一个元素坐标系转换到另一个元素坐标系,再或者是从视图坐标系转换到场景坐标系中。

比如说,我们想知道鼠标点击的这个位置是场景中的哪个元素。就需要先将视图坐标系下的坐标转换成场景坐标系下的坐标,在通过QGraphicsScene::itemAt()函数来找到这个位置的元素。

再比如说,我们想知道一个元素在视图中什么地方。就需要先将元素坐标系下的坐标转换成场景坐标系下的坐标,然后再从场景坐标系下的坐标转换成视图坐标系下的坐标。

Qt提供了mapToScene函数用于将元素坐标系下的坐标或者视图坐标系下的坐标转换成场景坐标,QGraphicsItem和QGraphicsView中都有这个函数。

mapFromScene()函数用于将场景坐标系下的坐标转换成元素坐标系下的坐标或者视图坐标系下的坐标,Item和View也都有这个函数。

Qt学习笔记-----Graphics_View_Framework相关推荐

  1. Qt学习笔记,Qt国际化

    Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\     ...

  2. Qt学习笔记,Qt程序架构设计要旨

    Qt学习笔记,Qt程序架构设计要旨 时间过得很快,转眼学习Qt已经有一个多月了,对Qt的学习也在不断的深入中.自己手下的code也很多了,不过不得不说,还有很多的部分没有接触过,比如网络编程,2D,3 ...

  3. Qt学习笔记之MySQL数据库

    一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...

  4. Qt学习笔记之数据库

    一.数据库简介 1.1.数据和数据库(DB) 用计算机进行数据处理,首先就要把信息以数据形式存储到计算机中,故数据是可以被计算机接受和处理的符号.根据所表示的信息特征不同,数据有不同的类别,如数字.文 ...

  5. Qt学习笔记之文件处理

    Qt提供了通用的文件处理类QFile和处理文本的QTextStream类和处理二进制数据的QDataStream类,这些流操作极大地方便了对文件的督促存储.对文件信息和目录进行操作的类是QfileIn ...

  6. Qt学习笔记之国际化

    国际化的英文表述为Internationalization,通常简写为I18N(首尾字母加中间的字符数),一个应用程序的国际化就是使该应用程序可以让其他国家的用户使用的过程. 1. 相关的Qt类和AP ...

  7. Qt学习笔记之 字符串类型小结

    1. Qt常用字符串类型 1.1 QString QString是Unicode编码的字符串,存储一系列16位的QChar,每一个QChar对应一个Unicode 4.0编码的字符,详见<Qt学 ...

  8. Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4)...

    Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4) 今天再次分析了Eva的源码,也看 ...

  9. QT学习笔记(十六):setwindowflags的属性总结

    QT学习笔记(十六):setwindowflags的属性总结 此枚举类型用于为小部件指定各种窗口系统属性.它们是不常用的,但在一些情况下是必要的.其中一些标志取决于底层窗口管理器是否支持它们. 主要类 ...

最新文章

  1. 【深度学习】正则化技术全面了解
  2. java gui 项目解密,java GUI(实例小项目--列出磁盘目录)
  3. python编程做什么工作-什么样的人要学点python编程?请你对号入座
  4. 大型网站系统架构演化之路
  5. numpy学习2:数组创建方式
  6. 【New】SAPUI5开发环境配置步骤
  7. 第五人格每天服务器维护多长时间,第五人格:每天玩的时间并不长,大概一天1-5局...
  8. STM32F103 PA8不能输出PWM波问题
  9. Apollo的学习笔记
  10. 惊叹 | 膜拜一下清华大学特等奖学金的学霸大佬们的简历! -- 我们没有理由不努力!...
  11. windows系统 Git Server git服务器自己搭建 (基于 Gitblit or Gogs )
  12. 训练深度神经网络时验证损失可能低于训练损失的三个原因:
  13. 专业解读:超高清4K是什么?
  14. 数据库学生信息管理系统
  15. java 对象转xml 工具类_工具类 Java对象和XML之间的相互转换-搜云库
  16. Centos宝塔面板清理垃圾空间
  17. Paddlenlp之UIE分类模型【以情感倾向分析新闻分类为例】含智能标注方案)
  18. 生物信息之独孤九剑——awk
  19. 【90】RootPort的completion timeout为什么不能阻止CPU发生MCE
  20. windows下maven打包镜像并推送docker服务器

热门文章

  1. Java黑皮书课后题第6章:*6.15(金融应用:打印税表)程序清单3-5给出了计算税款的程序。使用下面的方法体编写一个计算税款的方法。使用这个方法编写程序,打印可征税人从50000到60000间隔
  2. Java黑皮书课后题第2章:2.15(几何:两点间距离)编写程序,提示用户输入两个点(x1,y1)和(x2,y2),显示两点距离
  3. 《大型网站技术架构》5、6、7章阅读笔记
  4. Linux 下mysql5.7安装搬运 该安装说明坑最少
  5. Mac 安装多个python环境
  6. STL:大小写字母转换、字符转数字、char*转string(未完待续)
  7. 网状结构的解藕-中介者模式
  8. 【 D3.js 入门系列 --- 9 】 常见可视化图形
  9. 下一代Asp.net开发规范OWIN(3)—— Middleware
  10. ComboBox控件-转