Adam Baker
Adam Baker

Reputation: 44

Zoom on mouse position QGraphicsView

I am looking to find how to zoom in a QGraphicsView but on the cursor position. Currently I am able to zoom but the position it is zooming onto is not consistent.

    def wheelEvent(self, event):
        '''Wheel event to zoom
        '''
        # Run default event
        QtWidgets.QGraphicsView.wheelEvent(self, event)

        # Define zoom factor
        factor = 1.1
        if event.delta() < 0:
            factor = 0.9

        self.scale(factor, factor)

I have seen the use of self.mapToScene() but have been unsuccessful

Upvotes: 1

Views: 2995

Answers (1)

eyllanesc
eyllanesc

Reputation: 243897

A possible solution is to focus on the point where the mouse is, scale and recalculate the point where the new center should be:

def wheelEvent(self, event):
    factor = 1.1
    if event.delta() < 0:
        factor = 0.9
    view_pos = event.pos()
    scene_pos = self.mapToScene(view_pos)
    self.centerOn(scene_pos)
    self.scale(factor, factor)
    delta = self.mapToScene(view_pos) - self.mapToScene(self.viewport().rect().center())
    self.centerOn(scene_pos - delta)

Upvotes: 5

Related Questions