Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Such zooming is a bit tricky. Let me share my own class for doing that.</p> <p>Header:</p> <pre><code>#include &lt;QObject&gt; #include &lt;QGraphicsView&gt; /*! * This class adds ability to zoom QGraphicsView using mouse wheel. The point under cursor * remains motionless while it's possible. * * Note that it becomes not possible when the scene's * size is not large enough comparing to the viewport size. QGraphicsView centers the picture * when it's smaller than the view. And QGraphicsView's scrolls boundaries don't allow to * put any picture point at any viewport position. * * When the user starts scrolling, this class remembers original scene position and * keeps it until scrolling is completed. It's better than getting original scene position at * each scrolling step because that approach leads to position errors due to before-mentioned * positioning restrictions. * * When zommed using scroll, this class emits zoomed() signal. * * Usage: * * new Graphics_view_zoom(view); * * The object will be deleted automatically when the view is deleted. * * You can set keyboard modifiers used for zooming using set_modified(). Zooming will be * performed only on exact match of modifiers combination. The default modifier is Ctrl. * * You can change zoom velocity by calling set_zoom_factor_base(). * Zoom coefficient is calculated as zoom_factor_base^angle_delta * (see QWheelEvent::angleDelta). * The default zoom factor base is 1.0015. */ class Graphics_view_zoom : public QObject { Q_OBJECT public: Graphics_view_zoom(QGraphicsView* view); void gentle_zoom(double factor); void set_modifiers(Qt::KeyboardModifiers modifiers); void set_zoom_factor_base(double value); private: QGraphicsView* _view; Qt::KeyboardModifiers _modifiers; double _zoom_factor_base; QPointF target_scene_pos, target_viewport_pos; bool eventFilter(QObject* object, QEvent* event); signals: void zoomed(); }; </code></pre> <p>Source:</p> <pre><code>#include "Graphics_view_zoom.h" #include &lt;QMouseEvent&gt; #include &lt;QApplication&gt; #include &lt;QScrollBar&gt; #include &lt;qmath.h&gt; Graphics_view_zoom::Graphics_view_zoom(QGraphicsView* view) : QObject(view), _view(view) { _view-&gt;viewport()-&gt;installEventFilter(this); _view-&gt;setMouseTracking(true); _modifiers = Qt::ControlModifier; _zoom_factor_base = 1.0015; } void Graphics_view_zoom::gentle_zoom(double factor) { _view-&gt;scale(factor, factor); _view-&gt;centerOn(target_scene_pos); QPointF delta_viewport_pos = target_viewport_pos - QPointF(_view-&gt;viewport()-&gt;width() / 2.0, _view-&gt;viewport()-&gt;height() / 2.0); QPointF viewport_center = _view-&gt;mapFromScene(target_scene_pos) - delta_viewport_pos; _view-&gt;centerOn(_view-&gt;mapToScene(viewport_center.toPoint())); emit zoomed(); } void Graphics_view_zoom::set_modifiers(Qt::KeyboardModifiers modifiers) { _modifiers = modifiers; } void Graphics_view_zoom::set_zoom_factor_base(double value) { _zoom_factor_base = value; } bool Graphics_view_zoom::eventFilter(QObject *object, QEvent *event) { if (event-&gt;type() == QEvent::MouseMove) { QMouseEvent* mouse_event = static_cast&lt;QMouseEvent*&gt;(event); QPointF delta = target_viewport_pos - mouse_event-&gt;pos(); if (qAbs(delta.x()) &gt; 5 || qAbs(delta.y()) &gt; 5) { target_viewport_pos = mouse_event-&gt;pos(); target_scene_pos = _view-&gt;mapToScene(mouse_event-&gt;pos()); } } else if (event-&gt;type() == QEvent::Wheel) { QWheelEvent* wheel_event = static_cast&lt;QWheelEvent*&gt;(event); if (QApplication::keyboardModifiers() == _modifiers) { if (wheel_event-&gt;orientation() == Qt::Vertical) { double angle = wheel_event-&gt;angleDelta().y(); double factor = qPow(_zoom_factor_base, angle); gentle_zoom(factor); return true; } } } Q_UNUSED(object) return false; } </code></pre> <p>Usage example:</p> <pre><code>Graphics_view_zoom* z = new Graphics_view_zoom(ui-&gt;graphicsView); z-&gt;set_modifiers(Qt::NoModifier); </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload