2015-02-05 3 views
2

QGraphicsView에 경로를 그리려는 중입니다. 그러나 그 직책은 옳지 않은 것처럼 보입니다. 첫 번째 점 (빨간색)은 (0,0)이며, 왼쪽 위 모서리에 있어야합니다. 도면을 올바른 위치로 이동하려면 어떻게합니까?Pyqt4 : QGraphicsItem 위치를 수정하는 방법은 무엇입니까?

from PyQt4 import QtGui, QtCore 
from PyQt4.QtCore import QPointF as qpf 
import sys 
from PyQt4.QtGui import QPainterPath 

data= [qpf(0,0),qpf(40,30),qpf(30,60),qpf(70,90),qpf(20,120),qpf(60,150)] 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.view = View(self) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.view) 

class View(QtGui.QGraphicsView): 
    def __init__(self, parent): 
     QtGui.QGraphicsView.__init__(self, parent) 
     self.setScene(QtGui.QGraphicsScene(self)) 
     item = QtGui.QGraphicsRectItem(data[0].x()-2,data[0].y()-2,4,4) 
     item.setBrush(QtCore.Qt.red) 
     self.scene().addItem(item) 
     self.path = path = QPainterPath(data[0]) 
     for d in data[1:]: 
      path.lineTo(d) 
     item = QtGui.QGraphicsPathItem(path) 
     self.scene().addItem(item) 


    def mouseReleaseEvent(self, event): 
     pos = event.pos() 
     rect = QtCore.QRectF(pos.x()-2, pos.y()-2,4,4) 
     item = QtGui.QGraphicsRectItem(rect) 
     self.scene().addItem(item) 

     if self.path.intersects(rect): 
      print 'on line' 
     else: 
      print 'Not belong to line (%d, %d)' % (pos.x(), pos.y()) 

     QtGui.QGraphicsView.mouseReleaseEvent(self, event) 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.resize(400, 400) 
    window.show() 
    sys.exit(app.exec_()) 

답변

0

이 동작은 QGraphicsScene 및 QGraphicsView를 사용하여 그리기 때문입니다. 이것은 뷰와 씬이 자동적으로 편리하기 때문에 일반적으로 매우 편리합니다. 조정 된 장면은 뷰 (픽셀 단위 임)와 완전히 다를 수 있습니다.

docs에서 : "show()를 호출하면 뷰는 기본적으로 장면의 가운데로 스크롤하고이 시점에서 표시되는 항목을 표시합니다." 귀하의 경우에 show()가 암묵적으로 호출되면, 장면에 항목을 추가 한 후에 나는 믿습니다. 난 당신이 원하는 것을 얻기 위해 두 가지 가능성의

을 생각할 수있는 다음 (0 장면 좌표 있도록

1), 장면에보기를 변경, 0)보기의 왼쪽 상단에 있습니다.

2) QGraphicsScene 및 QGraphicsView를 사용하지 말고 그림판 here과 같이 페인트 이벤트에서 위젯을 그립니다. 즉, 크기가 모두 픽셀 단위입니다. 즉, 점의 좌표는 픽셀입니다. 그리고 당신을 혼란스럽게 할 수있는 자동화주의도 없습니다.

0

보기 클래스 생성자에서 self.setAlignment(QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)을 사용하면 장면 좌표의 0,0이보기 좌표의 0,0과 동일하게됩니다. AlignmentFlag

또한 mouseReleaseEvent에 pos = self.mapToScene(event.pos())을 제안합니다. 그런 식으로 장면을 확대하거나 스크롤하면보기의 올바른 위치에서 클릭이 발생합니다. QGraphicsView.mapFromScene

관련 문제