1
2
3
4
5
6
7
8
9
10 from __future__ import division
11
12 from python_qt_binding.QtCore import QPointF, QRectF, Qt
13 from python_qt_binding.QtGui import QGraphicsView, QTransform
14
15
16
17
18
19
21
23 super(InteractiveGraphicsView, self).__init__(parent)
24 self.setObjectName('InteractiveGraphicsView')
25
26 self._last_pan_point = None
27 self._last_scene_center = None
28
30 self._last_pan_point = mouse_event.pos()
31 self._last_scene_center = self._map_to_scene_f(QRectF(self.frameRect()).center())
32 self.setCursor(Qt.ClosedHandCursor)
33
35 self.setCursor(Qt.OpenHandCursor)
36 self._last_pan_point = None
37
39 if self._last_pan_point is not None:
40 delta_scene = self.mapToScene(mouse_event.pos()) - self.mapToScene(self._last_pan_point)
41 if not delta_scene.isNull():
42 self.centerOn(self._last_scene_center - delta_scene)
43 self._last_scene_center -= delta_scene
44 self._last_pan_point = mouse_event.pos()
45 QGraphicsView.mouseMoveEvent(self, mouse_event)
46
48 if wheel_event.modifiers() == Qt.NoModifier:
49 num_degrees = wheel_event.delta() / 8.0
50 num_steps = num_degrees / 15.0
51 mouse_before_scale_in_scene = self.mapToScene(wheel_event.pos())
52
53 scale_factor = 1.2 * num_steps
54 if num_steps < 0:
55 scale_factor = -1.0 / scale_factor
56 scaling = QTransform(scale_factor, 0, 0, scale_factor, 0, 0)
57 self.setTransform(self.transform() * scaling)
58
59 mouse_after_scale_in_scene = self.mapToScene(wheel_event.pos())
60 center_in_scene = self.mapToScene(self.frameRect().center())
61 self.centerOn(center_in_scene + mouse_before_scale_in_scene - mouse_after_scale_in_scene)
62
63 wheel_event.accept()
64 else:
65 QGraphicsView.wheelEvent(self, wheel_event)
66
68 point = pointf.toPoint()
69 if pointf.x() == point.x() and pointf.y() == point.y():
70
71 return self.mapToScene(point)
72 elif pointf.x() == point.x():
73
74 pointA = self.mapToScene((pointf + QPointF(0, -0.5)).toPoint())
75 pointB = self.mapToScene((pointf + QPointF(0, 0.5)).toPoint())
76 return (pointA + pointB) / 2.0
77 elif pointf.y() == point.y():
78
79 pointA = self.mapToScene((pointf + QPointF(-0.5, 0)).toPoint())
80 pointB = self.mapToScene((pointf + QPointF(0.5, 0)).toPoint())
81 return (pointA + pointB) / 2.0
82 else:
83
84 pointA = self.mapToScene((pointf + QPointF(-0.5, -0.5)).toPoint())
85 pointB = self.mapToScene((pointf + QPointF(-0.5, 0.5)).toPoint())
86 pointC = self.mapToScene((pointf + QPointF(0.5, -0.5)).toPoint())
87 pointD = self.mapToScene((pointf + QPointF(0.5, 0.5)).toPoint())
88 return (pointA + pointB + pointC + pointD) / 4.0
89