Qt中QGraphics类坐标映射关系详解
1、Item(图元)坐标:属于局部坐标,通常以图元中心为原点(中心对称),非中心对称类,比如dialog类,一般以左上角为原点,正方向x朝右,y朝下。
2、setPos的坐标是父类坐标系的坐标,一般对于item位于scene中的应用场景。
3、scene(场景)坐标:属于逻辑坐标 logical coordinates(与QPainter相同),以场景中心为原点,正方向x朝右,y朝下。
4、图元原点(左上角dialog的原点)与场景原点对齐,导致图元外边框的左上角顶点在场景中的坐标位置为(负数,负数)。
5、View(视图)坐标:属于设备坐标device coordinates(与窗口相同),默认以左上点为原点, 正方向x朝右,y朝下。
6、默认场景scene的左上角顶点与视图坐标原点对齐。显示时默认中心对齐,当场景大小小于视图大小的时候,将中心对齐,此中指的仍然是整个图元的中心,同时,图元原点与场景原点对齐,场景左上角顶点与视图原点对齐,视图左上角顶点不一定是原点???,此时也将出现视图坐标有正值有负值。
1)translate()将当前视图坐标原点平移,从而实现显示图像的平移变换。由于默认场景的左上角顶点与视图坐标原点对齐,translate()将坐标原点平移,也就实现了将场景的平移。
2)rotate()将当前视图围绕视图坐标原点旋转,从而实现显示图像的旋转变换。
3)size()返回视图大小,默认大小100*30,由于视图可以是无限大小而且只有在显示后才创建出实际尺寸,因此只有在showEvent中调用 size 函数才能正确显示视图大小,否则都是返回默认的100*30,因为此时视图尚未显示,即尚未形成。
--------------------------------------------------------------------------------------------------------------------------------------------------
首先,先上显示界面图(Embeded dialog),下面就是以该实例讲解:
1。QGraphicsItem及其衍生类以及其他可作为图元的类,总称Item(图元)类
Item坐标,属于局部坐标,通常以图元中心为原点(中心对称),非中心对称类,比如dialog类,一般以左上角为原点。故Item坐标的原点,需要具体问题具体分析。正方向x朝右,y朝下。除setPos函数外,所有Item类使用或得到的坐标都是该Item坐标。
1)boundingRect()返回外边框的左上顶点在item中的坐标(区别于原点,原点是(0,0)点,但是外边框由于具有宽度,所以肯定在原点的左上角,因此得到的坐标肯定是(负数,负数)的),比如下图:
输出:
对应到显示的点位如下:
2) setPos的坐标是父类坐标系的坐标,一般对于item位于scene中的应用场景,setPos对应的坐标就是scene(场景)坐标,输入的位置pos意思是该图元的原点在所在的场景坐标中的坐标,即该图元在场景中放置的位置。可以通过调用pos或scenePos查看。比如下图:
输入(红色框出部分):
对应到显示的点位如下:
注:个人认为应该是坐标原点,也就是默认的scene与整个item的原点(即左上角dialog的原点)对齐。此时dialog外边框顶点在场景中的位置将为(负数,负数),而非(0,0)。
2。QGraphicsScene类,即scene(场景)类
scene(场景)坐标,属于逻辑坐标 logical coordinates(与QPainter相同),以场景中心为原点,正方向x朝右,y朝下。图元嵌入场景中,默认场景原点与图元原点对齐。场景默认的对其方式为居中对其,这个中指的不是原点,而是所有item的Rect的中心点,是计算出来的。如果scene的大小超过view的可显示最大值,此时将改成左上角对齐显示,左上角点也不一定是场景坐标原点。如下面两图对比:
注:从上图(左上角对齐图)可以看出,场景中心不是显示的中心,显示中心是计算出来的,场景坐标就是虚拟的一个坐标中心,目的是方便计算。场景与图元整体默认原点对其,从而在上图(左上角对齐图)中,图元原点(左上角dialog的原点)与场景原点对齐,导致图元外边框的左上角顶点在场景中的坐标位置为(负数,负数),此时场景左上角点不是(0,0)而是(负数,负数)。如下图:
1)itemsBoundingRect()返回场景中所有item的外框顶点坐标和所有item整体的长宽。由于采用动态遍历所有图元的方法,所以当图元较多时,这个计算比较耗时。如图如下:
输出如下:
界面计算如下:
2)sceneRect()返回场景中可以看到的区域的顶点和长宽,可以看到的区域区别于所有图元的外边框itemsBoundingRect的顶点和长宽,一般二者是相同的,当出现图元移除时,二者才不同。因为sceneRect不能减少只能增加,故移除图元不能使可见的区域缩小,从而sceneRect不变,但是itemsBoundingRect()将减小。可以通过setSceneRect来重新设定区域的顶点和长宽。如图所示:
输出如图:
3。QGraphicsView类,即View(视图)类
视图坐标,属于设备坐标device coordinates(与窗口相同),默认以左上点为原点, 正方向x朝右,y朝下,此时坐标总是正值。当然,也可以通过调用函数translate更改视图坐标的原点位置,从而使视图坐标既有正值又有副值。显示时,默认场景scene的左上角顶点与视图坐标原点对齐。又由于显示时默认中心对齐,当场景大小小于视图大小的时候,将中心对齐,此中指的仍然是整个图元的中心,同时,图元原点与场景原点对齐,场景左上角顶点与视图原点对齐,视图左上角顶点不一定是原点,此时也将出现视图坐标有正值有负值。
1)translate()将当前视图坐标原点平移,从而实现显示图像的平移变换。由于默认场景的左上角顶点与视图坐标原点对齐,translate()将坐标原点平移,也就实现了将场景的平移。
2)rotate()将当前视图围绕视图坐标原点旋转,从而实现显示图像的旋转变换。
3)size()返回视图大小,默认大小100*30,由于视图可以是无限大小而且只有在显示后才创建出实际尺寸,因此只有在showEvent中调用 size 函数才能正确显示视图大小,否则都是返回默认的100*30,因为此时视图尚未显示,即尚未形成。
转载地址:http://klqulei23.blog.163.com/blog/static/132315337201392524857204/
Qt中QGraphics类坐标映射关系详解的更多相关文章
- 【转】UML类图与类的关系详解
UML类图与类的关系详解 2011-04-21 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(D ...
- UML类图与类的关系详解
摘自:http://www.uml.org.cn/oobject/201104212.asp UML类图与类的关系详解 2011-04-21 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类 ...
- Hibernate中的多对多关系详解(3)
前面两节我们讲到了一对一的关系,一对多,多对一的关系,相对来说,是比较简单的,但有时,我们也会遇到多对多的关系,比如说:角色与权限的关系,就是典型的多对多的关系,因此,我有必要对这种关系详解,以便大家 ...
- PyQt(Python+Qt)入门:Designer组件属性编辑界面中QWidget类相关属性详解
本文适用人员:本文比较长,适合不理解Qt Designer部件属性的人员阅读或资料查找. 声明: 1.如果有人认为本文是简单的复制粘贴+翻译而成,敬请读本文最后的后记: 2.本文为老猿Python学习 ...
- (转)UML类图与类的关系详解
转载自:http://www.uml.org.cn/oobject/201104212.asp 在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Rea ...
- 最清晰易懂的UML类图与类的关系详解
虚线箭头指向依赖: 实线箭头指向关联: 虚线三角指向接口: 实线三角指向父类: 空心菱形能分离而独立存在,是聚合: 实心菱形精密关联不可分,是组合: 上面是UML的语法. 在画类图的时候,理清类和类之 ...
- [转]五分钟看懂UML类图与类的关系详解
在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分为 ...
- UML类图与类的关系详解【转】
在画类图的时候,理清类和类之间的关系是重点. 类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分 ...
- 五分钟看懂UML类图与类的关系详解
在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分为 ...
随机推荐
- [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...
- 谷歌浏览器不兼容的一些Js
这篇博文主要记录本人在实际应用中碰到的谷歌浏览器与一些Js不兼容的问题,随着时间的推移,这篇博文的内容可能越来越多,也可能一点也没有(我想那时候谷歌肯定是相当牛逼的). 1.谷歌浏览器不兼容docum ...
- linux mint安装mysql-8.0.16
1.使用通用二进制文件在Unix / Linux上安装MySQL 下载的文件:mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz 注意: 如果您以前使用操作系统本机程 ...
- linux mint 19 打开 Windows 下制作的 TXT 文件时‘乱码’
因为 Linux 采用的是 UTF-8 编码,Windows 的中文编码是 GB18030. 解决的办法:让 Linux 的文本编辑器支持 GB18030 1.我们安装一个小软件"Dconf ...
- 【51nod 1340】地铁环线
题目 有一个地铁环线,环线中有N个站台,标号为0,1,2,...,N-1.这个环线是单行线,一共由N条有向边构成,即从0到1,1到2,..k到k+1,...,N-2到N-1,N-1到0各有一条边.定义 ...
- java文件实现文件的上传和下载
文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...
- SSH远程连接排错的过程
SSH远程连接排错的过程 http://note.youdao.com/noteshare?id=bc81e9036cd2067cb1857ca9f54299a7 补充 ping命令用来测试主机之间网 ...
- JS 时间转换函数 字符串时间转换毫秒(互转)
字符串转化为日期 let util = function(){ Date.prototype.Format = function(fmt) { var o = { "M+" : t ...
- COM 基础 之 三大基础接口
摘自 http://blog.csdn.net/liang4/article/details/7530512 1 COM组件实际上是一个C++类,而接口都是纯虚类.组件从接口派生而来. 2 COM组件 ...
- java代码连接oracle数据库的方法
oracle连接数据库的方式和mysql是大同小异的,主要的困难点在于oracle的数据库驱动包和依赖只有官方提供,如果你是用maven添加依赖的话,需要自己从官网下载jar包安装到你本地的maven ...