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