2015-02-05 40 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:「調用sh​​ow()後,視圖將默認滾動到場景的中心並顯示此時可見的任何項目。」 show()在你的情況下被隱式調用,我相信在你添加一個項目到場景之後。

我能想到的兩種可能得到你想要的東西:

1)更改視圖到場景,讓現場座標(0,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