• 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),下面就是以该实例讲解:

    6597897698914052525

    1。QGraphicsItem及其衍生类以及其他可作为图元的类,总称Item(图元)类

          Item坐标,属于局部坐标,通常以图元中心为原点(中心对称)非中心对称类,比如dialog类,一般以左上角为原点。故Item坐标的原点,需要具体问题具体分析。正方向x朝右,y朝下。除setPos函数外,所有Item类使用或得到的坐标都是该Item坐标。

    1)boundingRect()返回外边框的左上顶点在item中的坐标(区别于原点,原点是(0,0)点,但是外边框由于具有宽度,所以肯定在原点的左上角,因此得到的坐标肯定是(负数,负数)的),比如下图:

    2047730455670258985

    输出:        

    3014597000671340646

    对应到显示的点位如下:

    6598130795379038381

    2)  setPos的坐标是父类坐标系的坐标,一般对于item位于scene中的应用场景,setPos对应的坐标就是scene(场景)坐标,输入的位置pos意思是该图元的原点在所在的场景坐标中的坐标,即该图元在场景中放置的位置。可以通过调用pos或scenePos查看。比如下图:

    2065744854179602931

    输入(红色框出部分):

    899594025667791548

    对应到显示的点位如下:

    3122401916751435520

    注:个人认为应该是坐标原点,也就是默认的scene与整个item的原点(即左上角dialog的原点)对齐。此时dialog外边框顶点在场景中的位置将为(负数,负数),而非(0,0)。

    2。QGraphicsScene类,即scene(场景)类

            scene(场景)坐标,属于逻辑坐标 logical coordinates(与QPainter相同),以场景中心为原点,正方向x朝右,y朝下。图元嵌入场景中,默认场景原点与图元原点对齐。场景默认的对其方式为居中对其,这个中指的不是原点,而是所有item的Rect的中心点,是计算出来的。如果scene的大小超过view的可显示最大值,此时将改成左上角对齐显示,左上角点也不一定是场景坐标原点。如下面两图对比:

    1679561186132690974

    2019020008045634644

    注:从上图(左上角对齐图)可以看出,场景中心不是显示的中心,显示中心是计算出来的,场景坐标就是虚拟的一个坐标中心,目的是方便计算。场景与图元整体默认原点对其,从而在上图(左上角对齐图)中,图元原点(左上角dialog的原点)与场景原点对齐,导致图元外边框的左上角顶点在场景中的坐标位置为(负数,负数),此时场景左上角点不是(0,0)而是(负数,负数)。如下图:

    6597550253239675268

      1)itemsBoundingRect()返回场景中所有item的外框顶点坐标和所有item整体的长宽。由于采用动态遍历所有图元的方法,所以当图元较多时,这个计算比较耗时。如图如下:

    1440025980951859438

    输出如下:

    6597320455309080892

    界面计算如下:

    3143794014981561128

    2)sceneRect()返回场景中可以看到的区域的顶点和长宽,可以看到的区域区别于所有图元的外边框itemsBoundingRect的顶点和长宽,一般二者是相同的,当出现图元移除时,二者才不同。因为sceneRect不能减少只能增加,故移除图元不能使可见的区域缩小,从而sceneRect不变,但是itemsBoundingRect()将减小。可以通过setSceneRect来重新设定区域的顶点和长宽。如图所示:

    1921629666103818167

    输出如图: 

    6597732772169884109

    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/

  • 相关阅读:
    [论文笔记] On Construction of Cloud IaaS for VM Live Migration Using KVM and OpenNebula (ICA3PP, 2012)
    [论文笔记] Energyaware resource allocation heuristics for efficient management of data centers for Cloud computing (FGCS, 2012)
    [概念学习] hypervisor
    [论文泛读] Dynamic placement of virtual machines for managing sla violations (IM, 2007)
    [论文笔记] Costs of virtual machine live migration A survey (SERVICES, 2012)
    [论文笔记] Live Migration of Multiple Virtual Machines with Resource Reservation in Cloud Computing Environments (CLOUD, 2011)
    vscode如何搭建vue项目
    jenkins部署
    yum命令Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
    Spring 笔记——核心数据规则篇
  • 原文地址:https://www.cnblogs.com/cthu/p/5103551.html
Copyright © 2020-2023  润新知