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 num_degrees = wheel_event.delta() / 8.0
00067 num_steps = num_degrees / 15.0
00068 mouse_before_scale_in_scene = self.mapToScene(wheel_event.pos())
00069
00070 scale_factor = 1.2 * num_steps
00071 if num_steps < 0:
00072 scale_factor = -1.0 / scale_factor
00073 scaling = QTransform(scale_factor, 0, 0, scale_factor, 0, 0)
00074 self.setTransform(self.transform() * scaling)
00075
00076 mouse_after_scale_in_scene = self.mapToScene(wheel_event.pos())
00077 center_in_scene = self.mapToScene(self.frameRect().center())
00078 self.centerOn(center_in_scene + mouse_before_scale_in_scene - mouse_after_scale_in_scene)
00079
00080 wheel_event.accept()
00081 else:
00082 QGraphicsView.wheelEvent(self, wheel_event)
00083
00084 def _map_to_scene_f(self, pointf):
00085 point = pointf.toPoint()
00086 if pointf.x() == point.x() and pointf.y() == point.y():
00087
00088 return self.mapToScene(point)
00089 elif pointf.x() == point.x():
00090
00091 pointA = self.mapToScene((pointf + QPointF(0, -0.5)).toPoint())
00092 pointB = self.mapToScene((pointf + QPointF(0, 0.5)).toPoint())
00093 return (pointA + pointB) / 2.0
00094 elif pointf.y() == point.y():
00095
00096 pointA = self.mapToScene((pointf + QPointF(-0.5, 0)).toPoint())
00097 pointB = self.mapToScene((pointf + QPointF(0.5, 0)).toPoint())
00098 return (pointA + pointB) / 2.0
00099 else:
00100
00101 pointA = self.mapToScene((pointf + QPointF(-0.5, -0.5)).toPoint())
00102 pointB = self.mapToScene((pointf + QPointF(-0.5, 0.5)).toPoint())
00103 pointC = self.mapToScene((pointf + QPointF(0.5, -0.5)).toPoint())
00104 pointD = self.mapToScene((pointf + QPointF(0.5, 0.5)).toPoint())
00105 return (pointA + pointB + pointC + pointD) / 4.0