Python 在场景中两个QGraphicsItem的坐标之间转换点
我很难将一个项目坐标中的点转换为另一个项目坐标,就像这样Python 在场景中两个QGraphicsItem的坐标之间转换点,python,pyside,qgraphicsview,qgraphicsscene,qgraphicsitem,Python,Pyside,Qgraphicsview,Qgraphicsscene,Qgraphicsitem,我很难将一个项目坐标中的点转换为另一个项目坐标,就像这样 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 = QtGu
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)
我想你是假设一个项目的坐标系从它的左上角boundingRect开始,但它不是。此外,另一个概念是,传递给QGraphicsLineItem构造函数的坐标是相对于该项的,而不是相对于场景的坐标
p1(x1, y1)
╲
╲
╲
╲
╲
╲
p2(x2, y2)
The coordinates (x1, y1) and (x2, y2) are relative to the QGraphicsLineItem
因此,如果要获得两条线之间相对于line1的位置差,必须映射与QGraphicsLineItem关联的QLineF的p1值:
printline1.mapToItemline0,line0.line.p1-line1.line.p1
└--属于第0行的p1-----┘ └-属于谁-┘
相对于第1行到第1行相对于第1行
输出:
PySide.QtCore.QPointF-90.000000,0.000000
说明:
图形视图框架处理3种类型的坐标系:
关于QGraphicsView视口的坐标,即坐标取决于视图
对于场景的坐标系,所有视图都具有相同的坐标系。
每个项目的坐标系
可以用图像或视频记录系统进行类比。第一个坐标系指的是相对于相机可以看到什么,这取决于每个类似于QGraphicsView的相机。第二个坐标系是相对于真实世界的,它不依赖于相机。第三个坐标系是关于场景中的一个元素,例如一个演员
项目坐标系的点0,0与项目在场景中的位置匹配。在您的情况下,项目相对于场景的位置为0,0使用printline0.pos进行检查
从视觉上理解以下代码是相同的,但在概念上不是
类编辑器QTGUI.QMainWindow:
def u_init__self,父项=无:
超级编辑器,self.\u初始化\u父级
场景=QtGui.qgraphicscene
line0=QtGui.QGraphicsLineItem0,0,0,90
行0.setpos10210
line1=QtGui.QGraphicsLineItem0,0,0,90
行1.setpos100210
scene.addItem第0行
scene.addItem第1行
视图=QtGui.QGraphicsView
view.setScene场景
self.setGeometry 250250600600
self.setCentralWidgetview
自我表现
PySide是什么?这是您创建的类吗?这是Qt-Python@Olumide,您打算获得什么?我知道它是correct@eyllanesc我希望看到line1 wrt line0的坐标,例如-90,0@Olumide好的,这是line1.mapToItemline0。。。对于另一种情况,结果与line0.line.p1-line1.line.p1!相同。。。让我想知道是否有一个相对坐标系统潜伏着,那就是传递给QGraphicsItem::itemChangeGraphicsItemChange、const QVariant&value的值总是相对于项的初始位置。我真正想做的是防止RHS上的行项目被拖过LHS上的行项目。因此,根据行项目的相对偏移量进行推理要简单得多。@在这种情况下,它是一致的,因为项目相对于场景的位置0.pos==line1.pos==QtCore.QPointF0,0是相同的,但在一般情况下没有。另一方面,从itemChange获得的位置是项目相对于场景的位置。我认为你有一个XY问题,你的最终目标是什么?是否希望QGraphicsLineItem的分隔不超过阈值?以及测量坐标系的阈值?@Olumide[cont.]目前,您的示例并不重要,因为它没有缩放、旋转等变换。我建议阅读以了解坐标系感谢您的解释。行项目之间的行为/关系与拆分器的句柄没有区别。所以也许我应该看看我能用分离器走多远。我开始意识到,Qt中的复杂解决方案常常会重新发明Qt已经具备的某种功能。Qt是一个非常古老而庞大的框架,它很有可能实现了用户可能需要的大多数UI功能和行为。