MousePressEvent position offset in QGraphicsView

I have some difficulties with QGraphicsView and QGraphicsScene . When I increase / decrease the brightness in the scene and create elements with mousePressEvent, I have an offset in position. How can this be avoided?

event.pos() seems like a problem.

 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() 
+7
source share
1 answer

Repeat mousePressEvent on the scene, not in the view.

So the event argument will be QGraphicsSceneMouseEvent , which has several useful additional functions, including scenePos , which does exactly what you want:

 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) 
+6
source

All Articles