Я думаю, вы предполагаете, что система координат для элемента начинается в его topLeft boundingRect, но это не так.Кроме того, другая концепция заключается в том, что координаты, которые вы передаете конструктору QGraphicsLineItem, относятся к этому элементу, а не к координатам сцены.
p1(x1, y1)
╲
╲
╲
╲
╲
╲
p2(x2, y2)
The coordinates (x1, y1) and (x2, y2) are relative to the QGraphicsLineItem
Таким образом, если вы хотите получить разницу позиций между обеими линиями относительно line1, вы должны отобразить значение p1 () QLineF, связанного с QGraphicsLineItem:
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)
Объяснение:
Каркас графического представления обрабатывает 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()