在场景中的两个QGraphicsItem的坐标之间转换点

问题描述 投票:0回答:1

我很难将一个项目坐标中的点转换为另一个项目的坐标,就像这样

from PySide import QtGui, QtCore
import sys

class Editor(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Editor, self).__init__(parent)

        scene = QtGui.QGraphicsScene()

        line0 = QtGui.QGraphicsLineItem(  10 , 210 ,  10 , 300 )
        line1 = QtGui.QGraphicsLineItem( 100 , 210 , 100 , 300 )

        scene.addItem( line0 )
        scene.addItem( line1 )

        view = QtGui.QGraphicsView()
        view.setScene( scene )

        self.setGeometry( 250 , 250 , 600 , 600 )
        self.setCentralWidget(view)
        self.show()

        print line1.mapToItem( line0 , QtCore.QPoint( 0 , 0 ) )  # QPoint( 0 , 0 ) in line0's coordinates -> line1's coordinates
        print line1.mapToScene( QtCore.QPointF( 0 , 0 ) )        # QPoint( 0 , 0 ) in line0's coordinates -> screen coordinates


if __name__=="__main__":
    app=QtGui.QApplication(sys.argv)
    myapp = Editor()
    sys.exit(app.exec_())

结果似乎表明转换失败了

PySide.QtCore.QPointF(0.000000, 0.000000)
PySide.QtCore.QPointF(0.000000, 0.000000)
python pyside qgraphicsview qgraphicsscene qgraphicsitem
1个回答
1
投票

我认为你假设一个项目的坐标系是从它的topLeft boundingRect开始的,但事实并非如此。另外,另一个概念是传递给QGraphicsLineItem构造函数的坐标是相对于该项的,而不是相对于场景的坐标。

p1(x1, y1)
    ╲
     ╲
      ╲
       ╲
        ╲
         ╲
        p2(x2, y2)
The coordinates (x1, y1) and (x2, y2) are relative to the QGraphicsLineItem

因此,如果要获取两行之间相对于line1的位置差异,则必须映射与QGraphicsLineItem关联的QLineF的p1()值:

print(line1.mapToItem(line0 , line0.line().p1()) -   line1.line().p1())
      └----p1 that belongs to line0 ----------┘    └--p1 that belongs--┘    
              with respect to line1            to line1 with respect to line1

输出:

PySide.QtCore.QPointF(-90.000000, 0.000000)

说明:

Graphics View Framework处理3种类型的坐标系:

  • 关于QGraphicsView视口的坐标,即坐标取决于视图
  • 相对于场景的坐标系,所有视图都具有相同的坐标系。
  • 关于每个项目的坐标系

可以用图像或视频记录系统进行类比。第一个坐标系指的是相对于相机可以看到的内容,这取决于每个类似于QGraphicsView的相机。第二个坐标系相对于现实世界,它不依赖于相机。并且第三坐标系是关于场景中的元素,例如演员

项目坐标系的点(0, 0)与场景中项目的位置相匹配。在您的情况下,项目的位置相对于场景是(0,0)(用print(line0.pos()检查)。

从视觉上理解以下代码是相同的,但在概念上不是。

class Editor(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Editor, self).__init__(parent)
        scene = QtGui.QGraphicsScene()
        line0 = QtGui.QGraphicsLineItem(0, 0, 0, 90)
        line0.setPos(10, 210)
        line1 = QtGui.QGraphicsLineItem(0, 0, 0, 90)
        line1.setPos(100, 210)
        scene.addItem( line0 )
        scene.addItem( line1 )
        view = QtGui.QGraphicsView()
        view.setScene( scene )
        self.setGeometry( 250 , 250 , 600 , 600 )
        self.setCentralWidget(view)
        self.show()

© www.soinside.com 2019 - 2024. All rights reserved.