Преобразование точек между координатами двух объектов QGraphicsItem в сцене - PullRequest
0 голосов
/ 15 апреля 2019

У меня возникают трудности при преобразовании точек в координатах одного элемента в координаты другого элемента, например

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)

1 Ответ

1 голос
/ 15 апреля 2019

Я думаю, вы предполагаете, что система координат для элемента начинается в его 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()

...