2012-09-03 22 views
7

Tengo algunas dificultades con QGraphicsView y QGraphicsScene. Cuando hago zoom/unzoom en la escena y creo elementos con mousePressEvent, tengo un desplazamiento en la posición. ¿Cómo puede esto ser evitado?MousePressEvent, desplazamiento de posición en QGraphicsView

event.pos() parece ser el problema ..

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() 

Respuesta

6

reimplementar mousePressEvent en la escena, en lugar de la vista.

De esta manera, el argumento event será un QGraphicsSceneMouseEvent, que tiene varias funciones adicionales útiles - incluyendo scenePos, que hace exactamente lo que quiere:

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

me gusta esta solución y lo usaré yo. Es como tener internamente un mousePressEvent en la vista de gráficos y luego mapToScene la posición del mouse. Pero esto es más elegante. – Trilarion

Cuestiones relacionadas