Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在场景中两个QGraphicsItem的坐标之间转换点_Python_Pyside_Qgraphicsview_Qgraphicsscene_Qgraphicsitem - Fatal编程技术网

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功能和行为。