Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 from __future__ import division
00034 
00035 from python_qt_binding.QtCore import QPointF, QRectF, Qt
00036 from python_qt_binding.QtGui import QGraphicsView, QTransform
00037 
00038 
00039 class InteractiveGraphicsView(QGraphicsView):
00040 
00041     def __init__(self, parent=None):
00042         super(InteractiveGraphicsView, self).__init__(parent)
00043         self.setObjectName('InteractiveGraphicsView')
00044 
00045         self._last_pan_point = None
00046         self._last_scene_center = None
00047 
00048     def mousePressEvent(self, mouse_event):
00049         self._last_pan_point = mouse_event.pos()
00050         self._last_scene_center = self._map_to_scene_f(QRectF(self.frameRect()).center())
00051         self.setCursor(Qt.ClosedHandCursor)
00052 
00053     def mouseReleaseEvent(self, mouse_event):
00054         self.setCursor(Qt.OpenHandCursor)
00055         self._last_pan_point = None
00056 
00057     def mouseMoveEvent(self, mouse_event):
00058         if self._last_pan_point is not None:
00059             delta_scene = self.mapToScene(mouse_event.pos()) - self.mapToScene(self._last_pan_point)
00060             if not delta_scene.isNull():
00061                 self.centerOn(self._last_scene_center - delta_scene)
00062                 self._last_scene_center -= delta_scene
00063             self._last_pan_point = mouse_event.pos()
00064         QGraphicsView.mouseMoveEvent(self, mouse_event)
00065 
00066     def wheelEvent(self, wheel_event):
00067         if wheel_event.modifiers() == Qt.NoModifier:
00068             num_degrees = wheel_event.delta() / 8.0
00069             num_steps = num_degrees / 15.0
00070             mouse_before_scale_in_scene = self.mapToScene(wheel_event.pos())
00071 
00072             scale_factor = 1.2 * num_steps
00073             if num_steps < 0:
00074                 scale_factor = -1.0 / scale_factor
00075             scaling = QTransform(scale_factor, 0, 0, scale_factor, 0, 0)
00076             self.setTransform(self.transform() * scaling)
00077 
00078             mouse_after_scale_in_scene = self.mapToScene(wheel_event.pos())
00079             center_in_scene = self.mapToScene(self.frameRect().center())
00080             self.centerOn(center_in_scene + mouse_before_scale_in_scene - mouse_after_scale_in_scene)
00081 
00082             wheel_event.accept()
00083         else:
00084             QGraphicsView.wheelEvent(self, wheel_event)
00085 
00086     def _map_to_scene_f(self, pointf):
00087         point = pointf.toPoint()
00088         if pointf.x() == point.x() and pointf.y() == point.y():
00089             
00090             return self.mapToScene(point)
00091         elif pointf.x() == point.x():
00092             
00093             pointA = self.mapToScene((pointf + QPointF(0, -0.5)).toPoint())
00094             pointB = self.mapToScene((pointf + QPointF(0, 0.5)).toPoint())
00095             return (pointA + pointB) / 2.0
00096         elif pointf.y() == point.y():
00097             
00098             pointA = self.mapToScene((pointf + QPointF(-0.5, 0)).toPoint())
00099             pointB = self.mapToScene((pointf + QPointF(0.5, 0)).toPoint())
00100             return (pointA + pointB) / 2.0
00101         else:
00102             
00103             pointA = self.mapToScene((pointf + QPointF(-0.5, -0.5)).toPoint())
00104             pointB = self.mapToScene((pointf + QPointF(-0.5, 0.5)).toPoint())
00105             pointC = self.mapToScene((pointf + QPointF(0.5, -0.5)).toPoint())
00106             pointD = self.mapToScene((pointf + QPointF(0.5, 0.5)).toPoint())
00107             return (pointA + pointB + pointC + pointD) / 4.0