29 #include <QApplication>
30 #include <QGraphicsItem>
31 #include <QMouseEvent>
44 _view->viewport()->installEventFilter(
this);
45 _view->setMouseTracking(
true);
46 _modifiers = Qt::ControlModifier;
47 _zoom_factor_base = 1.0015;
53 _view->scale(factor, factor);
54 _view->centerOn(target_scene_pos);
55 QPointF delta_viewport_pos =
57 QPointF(_view->viewport()->width() / 2.0, _view->viewport()->height() / 2.0);
58 QPointF viewport_center = _view->mapFromScene(target_scene_pos) - delta_viewport_pos;
59 _view->centerOn(_view->mapToScene(viewport_center.toPoint()));
66 _modifiers = modifiers;
72 _zoom_factor_base =
value;
82 Graphics_view_zoom::eventFilter(QObject*
object, QEvent* event)
84 if (event->type() == QEvent::MouseMove)
86 QMouseEvent* mouse_event =
static_cast<QMouseEvent*
>(event);
87 QPointF delta = target_viewport_pos - mouse_event->pos();
89 if (fabs(delta.x()) > 5 || fabs(delta.y()) > 5)
91 target_viewport_pos = mouse_event->pos();
92 target_scene_pos = _view->mapToScene(mouse_event->pos());
95 if (mouse_event->modifiers() == Qt::AltModifier)
97 auto center = _view->mapToScene(_view->viewport()->rect().center());
98 auto mat = _view->matrix();
99 QPointF scale(mat.m11(), mat.m22());
102 delta.setX(delta.x() / scale.x());
103 delta.setY(delta.y() / scale.y());
104 _view->centerOn(center.x() + delta.x(), center.y() + delta.y());
108 else if (event->type() == QEvent::Wheel)
110 QWheelEvent* wheel_event =
static_cast<QWheelEvent*
>(event);
112 if (QApplication::keyboardModifiers() == _modifiers)
114 if (wheel_event->orientation() == Qt::Vertical)
116 double angle = wheel_event->delta() * 0.5;
117 double factor = pow(_zoom_factor_base,
angle);
123 else if (event->type() == QEvent::MouseButtonDblClick)
125 QMouseEvent* mouse_event =
static_cast<QMouseEvent*
>(event);
126 QGraphicsItem* item = _view->itemAt(mouse_event->pos());
130 ItemZoomer* zoomer =
new ItemZoomer(_view, item, 500, item);
131 connect(zoomer, SIGNAL(
zoomed()),
this, SIGNAL(
zoomed()));
141 const QGraphicsItem* item,
143 QGraphicsItem* parent) :
144 QGraphicsObject(parent), mView(view), mItem(item)
146 lt =
new QTimeLine(time,
this);
147 br =
new QTimeLine(time,
this);
151 start = mView->mapToScene(mView->rect()).boundingRect();
153 mItem->mapToScene(mItem->boundingRect().adjusted(-50, -50, 50, 50)).boundingRect();
154 curLT = start.topLeft();
155 curBR = start.bottomRight();
157 ltStepSize = (end.topLeft() - start.topLeft()) / 100.0;
158 brStepSize = (end.bottomRight() - start.bottomRight()) / 100.0;
160 lt->setFrameRange(0, 100);
161 br->setFrameRange(0, 100);
163 connect(lt, SIGNAL(frameChanged(
int)), SLOT(setHeight(
int)));
164 connect(br, SIGNAL(frameChanged(
int)), SLOT(setWidth(
int)));
166 connect(lt, SIGNAL(finished()), SLOT(setTimeLineLTFinished()));
167 connect(br, SIGNAL(finished()), SLOT(setTimeLineBRFinished()));
177 ItemZoomer::setHeight(
int height)
179 curLT = start.topLeft() + ltStepSize * height;
184 ItemZoomer::setWidth(
int width)
186 curBR = start.bottomRight() + brStepSize * width;
191 ItemZoomer::setTimeLineBRFinished()
198 ItemZoomer::setTimeLineLTFinished()
205 ItemZoomer::deleteSelf()
207 if (brFinished && ltFinished)
216 QRectF rect = mItem->mapToScene(mItem->boundingRect()).boundingRect();
217 rect.setTopLeft(curLT);
218 rect.setBottomRight(curBR);
220 mView->fitInView(rect, Qt::KeepAspectRatio);
227 return QRectF(0, 0, 0, 0);