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 from __future__ import division
00032
00033 from python_qt_binding.QtCore import QPointF, QRectF, Qt
00034 from python_qt_binding.QtGui import QGraphicsView, QTransform
00035
00036
00037 class InteractiveGraphicsView(QGraphicsView):
00038
00039 def __init__(self, parent=None):
00040 super(InteractiveGraphicsView, self).__init__(parent)
00041 self.setObjectName('InteractiveGraphicsView')
00042
00043 self._last_pan_point = None
00044 self._last_scene_center = None
00045
00046 def mousePressEvent(self, mouse_event):
00047 self._last_pan_point = mouse_event.pos()
00048 self._last_scene_center = self._map_to_scene_f(QRectF(self.frameRect()).center())
00049 self.setCursor(Qt.ClosedHandCursor)
00050
00051 def mouseReleaseEvent(self, mouse_event):
00052 self.setCursor(Qt.OpenHandCursor)
00053 self._last_pan_point = None
00054
00055 def mouseMoveEvent(self, mouse_event):
00056 if self._last_pan_point is not None:
00057 delta_scene = self.mapToScene(mouse_event.pos()) - self.mapToScene(self._last_pan_point)
00058 if not delta_scene.isNull():
00059 self.centerOn(self._last_scene_center - delta_scene)
00060 self._last_scene_center -= delta_scene
00061 self._last_pan_point = mouse_event.pos()
00062 QGraphicsView.mouseMoveEvent(self, mouse_event)
00063
00064 def wheelEvent(self, wheel_event):
00065 if wheel_event.modifiers() == Qt.NoModifier:
00066 delta = wheel_event.delta()
00067 delta = max(min(delta, 480), -480)
00068 mouse_before_scale_in_scene = self.mapToScene(wheel_event.pos())
00069
00070 scale_factor = 1 + (0.2 * (delta / 120.0))
00071 scaling = QTransform(scale_factor, 0, 0, scale_factor, 0, 0)
00072 self.setTransform(self.transform() * scaling)
00073
00074 mouse_after_scale_in_scene = self.mapToScene(wheel_event.pos())
00075 center_in_scene = self.mapToScene(self.frameRect().center())
00076 self.centerOn(center_in_scene + mouse_before_scale_in_scene - mouse_after_scale_in_scene)
00077
00078 wheel_event.accept()
00079 else:
00080 QGraphicsView.wheelEvent(self, wheel_event)
00081
00082 def _map_to_scene_f(self, pointf):
00083 point = pointf.toPoint()
00084 if pointf.x() == point.x() and pointf.y() == point.y():
00085
00086 return self.mapToScene(point)
00087 elif pointf.x() == point.x():
00088
00089 pointA = self.mapToScene((pointf + QPointF(0, -0.5)).toPoint())
00090 pointB = self.mapToScene((pointf + QPointF(0, 0.5)).toPoint())
00091 return (pointA + pointB) / 2.0
00092 elif pointf.y() == point.y():
00093
00094 pointA = self.mapToScene((pointf + QPointF(-0.5, 0)).toPoint())
00095 pointB = self.mapToScene((pointf + QPointF(0.5, 0)).toPoint())
00096 return (pointA + pointB) / 2.0
00097 else:
00098
00099 pointA = self.mapToScene((pointf + QPointF(-0.5, -0.5)).toPoint())
00100 pointB = self.mapToScene((pointf + QPointF(-0.5, 0.5)).toPoint())
00101 pointC = self.mapToScene((pointf + QPointF(0.5, -0.5)).toPoint())
00102 pointD = self.mapToScene((pointf + QPointF(0.5, 0.5)).toPoint())
00103 return (pointA + pointB + pointC + pointD) / 4.0