2012-09-03 36 views
7

Tôi gặp một số khó khăn với QGraphicsViewQGraphicsScene. Khi tôi zoom/unzoom trong cảnh và tạo các mục bằng mousePressEvent, tôi có một offset ở vị trí. Làm thế nào điều này có thể tránh được?MousePressEvent, vị trí bù đắp trong QGraphicsView

event.pos() có vẻ là vấn đề ..

from PyQt4 import QtCore, QtGui 

class graphicsItem (QtGui.QGraphicsItem): 
    def __init__ (self): 
     super(graphicsItem, self).__init__() 
     self.rectF = QtCore.QRectF(0,0,10,10) 
    def boundingRect (self): 
     return self.rectF 
    def paint (self, painter=None, style=None, widget=None): 
     painter.fillRect(self.rectF, QtCore.Qt.red) 

class graphicsScene (QtGui.QGraphicsScene): 
    def __init__ (self, parent=None): 
     super (graphicsScene, self).__init__ (parent) 

class graphicsView (QtGui.QGraphicsView): 
    def __init__ (self, parent = None): 
     super (graphicsView, self).__init__ (parent) 
     self.parent = parent 
    def mousePressEvent(self, event): 
     super (graphicsView, self).mousePressEvent(event) 
     item = graphicsItem() 
     position = QtCore.QPointF(event.pos()) - item.rectF.center() 
     item.setPos(position.x() , position.y()) 
     self.parent.scene.addItem(item) 
    def wheelEvent (self, event): 
     super (graphicsView, self).wheelEvent(event) 
     factor = 1.2 
     if event.delta() < 0 : 
      factor = 1.0/factor 
     self.scale(factor, factor) 

class window (QtGui.QMainWindow): 
    def __init__ (self, parent = None) : 
     super (window, self).__init__(parent) 
     self.width = 800 
     self.height = 600 

     self.resize(self.width,self.height) 
     self.mainLayout = QtGui.QVBoxLayout(self) 

     self.view = graphicsView(self) 
     self.scene = graphicsScene(self) 
     self.view.setScene (self.scene) 

     factor = 1 
     self.scene.setSceneRect(0, 0, self.width * factor, self.height * factor) 
     self.view.setMinimumSize(self.width, self.height) 

     self.mainLayout.addWidget(self.view) 

    def show (self): 
     super (window, self).show() 

Trả lời

6

reimplement mousePressEvent trên sân khấu, chứ không phải là quan điểm.

Bằng cách đó, các lập luận event sẽ là một QGraphicsSceneMouseEvent, trong đó có thêm một số chức năng hữu ích - bao gồm scenePos, mà thực hiện chính xác những gì bạn muốn:

class graphicsScene(QtGui.QGraphicsScene): 
    def __init__ (self, parent=None): 
     super(graphicsScene, self).__init__ (parent) 

    def mousePressEvent(self, event): 
     super(graphicsScene, self).mousePressEvent(event) 
     item = graphicsItem() 
     position = QtCore.QPointF(event.scenePos()) - item.rectF.center() 
     item.setPos(position.x() , position.y()) 
     self.addItem(item) 
+1

Tôi thích giải pháp này và sẽ sử dụng nó bản thân mình. Nó giống như trong nội bộ có một mousePressEvent trên khung nhìn đồ họa và sau đó mapToScene vị trí chuột. Nhưng điều này là thanh lịch hơn. – Trilarion

Các vấn đề liên quan