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