1、在GraphicsView的坐标体系中,物体的坐标系是以物体的中心为原点(0,0),物体在几何学上的原始点通常对应物体的p泠贾高框oints,lines,rectangles。当你创建自定义物体时,QGraphicsScene和QGraphicsView会为你做好所有的坐标变换,我们只需要关注物体自身的坐标系就可以了。譬如,我们收到的鼠标事件或者拖拽事件,这个事件的坐标点就是指物体的坐标系里的。同样,物体的boundingrect和shape也是在物体的坐标系里的。物体的位置是指物体的中心点,即原点,在它的父物体parent的坐标系中的坐标,没有parent的物体,场景scene就是该物体的parent,顶层物体(作为其他物体的parent参数的物体)的位置是在scene的坐标系中。子物体的坐标系是对照于父物体的坐标系,如果子物体未经变换,子物体坐标系和父物体坐标系的不同之处和子物体在父物体坐标系中的距离是一样的。例如:一个未经坐标变换的子物体放在父物体的中心,那么两者的坐标系就是一样的了。如果子物体的位置是(10,0),那么子物体上(0,10)的点就对应于父物体(10,10)的点。由于子物体的位置和坐标变换是对照于父物体的,所以父物体坐标的变换对子物体来说是没有影响的,原来子物体上(0,10)的点,对照父物体的时候,还是(10,10)的点。而对照scene的时候,子物体和父物体就一样也变换了坐标了,假如父物体缩放了(2x,2x),那么子物体的位置在scene上就是(20,0)了,子物体上(10,0)的点在scene上就是(40,0)了。除了QGraphicsItem::pos()函数指明子物体在父物体上的位置坐标,QGraphicsItem的其他函数都是获取子物体上的坐标的。这里我们看个例子:我在scene上添加了一个图片item,如果我不设置scene的位置和大小,那么Item(这里Item没有parent)的位置将和scene一样。调试信息里面可以看到大小和位置:
2、如果我只是改变Item物体的位置,因为参照物scene没有变换位置,所以Item的位置将不变。如下图:
3、当我设置scene的位置后,Item物体的位置就可以由setpos函数进行改变了。如下图:
4、场景坐标:场景是GraphicsView上所有物体的基本坐标系统,即物体都是放在场景上的,这里的场景我们可以理解为场所,把物体放在唁昼囫缍这个场所。场景的事件里面的坐标都是指场景参照视图view的位置坐标的,场景是放在视图view上的。View本质上是继承QWidget的,而Scene是继承自QObject的,Scene是不可见的,如下图,我设置了graphicsView的场景为scene,但scene是看不见的,它可以设置大小,我们可以把它理解为画布,物理上可以理解为场所。每个scene上的物体除了有一个参照scene的坐标,还有他们自己参照父物体的坐标,即pos()函数获取的坐标。
5、视图坐标:视图坐标即GraphicsView这个控件widget本身的坐标了,我们可以像其他widget一样去理解这里的坐标的。所有的鼠标事件和拖拽事件都是由视图接收的,所以这时候如果我们需要与场景上的物体进行交互的话,就需要映射视图坐标到物体坐标了。我们可以使用mapToScene()等等函数来进行映射。