def __init__(self, scene): super(ScalingView, self).__init__(scene) #from PyQt4 import QtOpenGL #self.opengl = QtOpenGL.QGLWidget(QtOpenGL.QGLFormat(QtOpenGL.QGL.SampleBuffers)) #self.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers))); #self.setViewport(self.opengl) #this would work if scene used a bitmap for background brush #self.setCacheMode(self.CacheBackground) self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.scaler = ScaleAnimation(self) self.scaler.finished.connect(self.scale_finished) self.scroller = ViewScrollAnimation(self) self.scroller.finished.connect(self.scroll_finished) self.viewport_changed.connect(scene.widget._onViewportChanged) self.scale_changed.connect(scene.widget._onViewScaleChanged) self.scale_started.connect(scene._onViewScaleStarted) self.scale_finished.connect(scene._onViewScaleFinished) self.scroll_started.connect(scene._onViewScrollStarted) self.scroll_finished.connect(scene._onViewScrollFinished) self.horizontalScrollBar().valueChanged.connect(self._onValueChanged) self.verticalScrollBar().valueChanged.connect(self._onValueChanged)
class ScalingView(QtGui.QGraphicsView): scale_changed = QtCore.pyqtSignal(float) scale_started = QtCore.pyqtSignal() scale_finished = QtCore.pyqtSignal() scroll_started = QtCore.pyqtSignal() scroll_finished = QtCore.pyqtSignal() viewport_changed = QtCore.pyqtSignal(QtCore.QRectF, float) def __init__(self, scene): super(ScalingView, self).__init__(scene) #from PyQt4 import QtOpenGL #self.opengl = QtOpenGL.QGLWidget(QtOpenGL.QGLFormat(QtOpenGL.QGL.SampleBuffers)) #self.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers))); #self.setViewport(self.opengl) #this would work if scene used a bitmap for background brush #self.setCacheMode(self.CacheBackground) self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.scaler = ScaleAnimation(self) self.scaler.finished.connect(self.scale_finished) self.scroller = ViewScrollAnimation(self) self.scroller.finished.connect(self.scroll_finished) self.viewport_changed.connect(scene.widget._onViewportChanged) self.scale_changed.connect(scene.widget._onViewScaleChanged) self.scale_started.connect(scene._onViewScaleStarted) self.scale_finished.connect(scene._onViewScaleFinished) self.scroll_started.connect(scene._onViewScrollStarted) self.scroll_finished.connect(scene._onViewScrollFinished) self.horizontalScrollBar().valueChanged.connect(self._onValueChanged) self.verticalScrollBar().valueChanged.connect(self._onValueChanged) def _onValueChanged(self, value): rect = self.viewport().geometry() new = self.mapToScene(rect).boundingRect() self.viewport_changed.emit(new, self.getScale()) def getScale(self): t = self.transform() sx, sy = t.m11(), t.m22() if sx != sy: raise ValueError('Aspect Ratio Corrupt') return sx def setScale(self, factor): t = QtGui.QTransform.fromScale(1, 1) t.scale(factor, factor) self.setTransform(t) self.scale_changed.emit(factor) scale = QtCore.pyqtProperty('float', getScale, setScale) def getHpos(self): return self.horizontalScrollBar().value() def setHpos(self, value): return self.horizontalScrollBar().setValue(value) hpos = QtCore.pyqtProperty('int', getHpos, setHpos) def getVpos(self): return self.verticalScrollBar().value() def setVpos(self, value): return self.verticalScrollBar().setValue(value) vpos = QtCore.pyqtProperty('int', getVpos, setVpos) def zoom(self, scale): self.scale_started.emit() self.scaler.scaleTo(scale) def scroll(self, direction): self.scroller.scroll(direction)