Getting QGraphicsView with a pixmap to Zoom and Scroll Like the Window’s Photo Viewer

This took me forever to figure out.  I noticed lots of people online had the same question but few got it working properly and some had to do a hack.  Here is the clean way to do this.  The trick is in setTransformationAnchor() and setDragMode()

My setup code in my QDailogs __init__ function:

imageFilename = QFileDialog.getOpenFileName(self,'select image')
self._pixMap = QPixmap.fromImage(QImage(imageFilename)) 
self._graphicsScene = QGraphicsScene(self)
self._graphicsScene.addPixmap(self._pixMap)
self._view = MyGraphicsView()
self._view.setScene(self._graphicsScene)

# Create a vertical layout.
self._layout = QVBoxLayout()
self._layout.setMargin(0)
self._layout.setSpacing(0)

# Add label widget
self._layout.addWidget(self._view)
# set widget to layout
self.setLayout(self._layout)

 

Here is my implementation of the MyGraphicsView class.  Derived from QGraphicsView

class MyGraphicsView(QGraphicsView):
    def __init__(self):
        QGraphicsView.__init__(self)
        self.setRenderHints(QPainter.Antialiasing|QPainter.SmoothPixmapTransform)
        self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
        self.setDragMode(QGraphicsView.ScrollHandDrag)
    def wheelEvent(self,event):        
        adj = (event.delta()/120) * 0.1
        self.scale(1+adj,1+adj)