我很难像这样将一个项目的坐标中的点转换为另一项目的坐标
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)
答案 0 :(得分: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类似的摄像机。第二个坐标系是相对于现实世界的,它不依赖于相机。第三坐标系是相对于场景中的元素(例如演员)
该项目的坐标系统的点(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()