QGraphicsView系统坐标映射关系

如果你英文足够好,可以参考Qt帮助文档中的:The Graphics View Coordinate System。
---------------------------------------------------------------------------------------------------------------------------
首先,先上显示界面图(Embeded dialog),下面就是以该实例讲解:
Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
 
1。QGraphicsItem及其衍生类以及其他可作为图元的类,总称Item(图元)类
      Item坐标,属于局部坐标。通常以图元中心为原点(中心对称);非中心对称类,比如dialog类,一般 以左上角为原点。故Item坐标的原点,需要具体问题具体分析。正方向x朝右,y朝下。除setPos函数外,所有Item类使用或得到的坐标都是该Item坐标。
1)boundingRect()返回外边框的左上顶点在item中的坐标(区别于原点,原点是(0,0)点,但是外边框由于具有宽度,所以肯定在原点的左上角,因此得到的坐标肯定是(负数,负数)的),比如下图:
Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
输出:        
          Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
对应到显示的点位如下:
Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
 
2) setPos的坐标是父类坐标系的坐标,一般对于item位于scene中的应用场景,setPos对应的坐标就是scene(场景)坐标,输入的位置pos意思是该 图元的原点在所在的场景坐标中的坐标,即该图元在场景中放置的位置。可以通过调用pos或scenePos查看。比如下图: Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
输入(红色框出部分):
Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
对应到显示的点位如下:
Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
 注:个人认为应该是第一个dialog的坐标原点。 也就是默认的scene与整个item的原点(即左上角dialog的原点)对齐。此时dialog外边框顶点在场景中的位置将为(负数,负数),而非(0,0)!!!
 
2。QGraphicsScene类,即scene(场景)类
        scene(场景)坐标,属于逻辑坐标 logical coordinates(与QPainter相同),以场景中心 为原点,正方向x朝右,y朝下。图元嵌入场景中,默认场景原点与图元原点对齐。1、如果scene的大小不超过view可显示的最大值,那么scene在view中的默认对齐方式为居中对齐(如下图),这个中指的不是原点,而是所有item的Rect的中心点,是计算出来的;2、如果scene的大小超过view的可显示最大值,此时scene将在view中改成左上角对齐显示,左上角点也不一定是场景坐标原点(如下下图)。如下面两图对比:
Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
 
Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
注: 在上图(左上角对齐图)中,图元原点(左上角dialog的原点)与场景原点对齐,导致图元外边框的左上角顶点在场景中的坐标位置为(负数,负数),此时场景左上角点不是(0,0)而是(负数,负数)。如下图:
Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
  1)itemsBoundingRect()返回场景中所有item的外框顶点坐标和所有item整体的长宽。由于采用动态遍历所有图元的方法,所以当图元较多时,这个计算比较耗时。如图如下:
Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
输出如下:
Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
 界面计算如下:
Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
 
2)sceneRect()返回场景中可以看到的区域的顶点和长宽,可以看到的区域区别于所有图元的外边框 itemsBoundingRect的顶点和长宽, 一般二者是相同的,只有当出现图元移除时,二者才不同。因为sceneRect不能减少只能增加,故移除图元不能使可见的区域缩小,从而sceneRect不变, 但是itemsBoundingRect()将减小。可以通过setSceneRect来重新设定区域的顶点和长宽。如图所示
  Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
输出如图: 
Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解) - 小影不爱睡 - 影 的博客
注:secene的sceneRect()不是可视的secene的大小,而是大部分时间和itemsBoundingRect()的大小相同!

 3。QGraphicsView类,即View(视图)类
        视图坐标,属于设备坐标device coordinates(与窗口相同), 默认以左上点为原点正方向x朝右,y朝下,此时坐标总是正值。 当然,也可以通过调用函数translate更改视图坐标的原点位置,从而使试图坐标既有正值又有副值 显示时,默认场景scene的左上角顶点(一般肯定不是secene的(0,0)坐标点)与视图坐标原点对齐。又由于显示时默认中心对齐,当场景大小小于视图大小的时候,将中心对齐,此中指的仍然是整个图元的中心,同时,图元原点与场景原点对齐,场景左上角顶点与视图原点对齐,视图左上角顶点不一定是原点,此时也将出现视图坐标有正值有负值。
1) translate()将当前视图坐标原点平移,从而实现显示图像的平移变换。由于默认场景的左上角顶点与视图坐标原点对齐, translate()将坐标原点平移,也就实现了将场景的平移
2)rotate() 将当前视图围绕视图坐标原点旋转,从而实现显示图像的旋转变换。
3)size()返回视图大小,默认大小100*30,由于视图可以是无限大小而且只有在显示后才创建出实际尺寸,因此只有在showEvent中调用 size  函数才能正确显示视图大小,否则都是返回默认的100*30,因为此时视图尚未显示,即尚未形成
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值