diff options
Diffstat (limited to 'src/graphicsview.cpp')
| -rw-r--r-- | src/graphicsview.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/graphicsview.cpp b/src/graphicsview.cpp new file mode 100644 index 0000000..b81cff4 --- /dev/null +++ b/src/graphicsview.cpp @@ -0,0 +1,47 @@ +#include "graphicsview.h" + +// qt +#include <QWheelEvent> + +GraphicsView::GraphicsView(QWidget* parent) + : QGraphicsView{parent} +{ + init(); +} + +GraphicsView::GraphicsView(QGraphicsScene* scene, QWidget* parent) + : QGraphicsView{scene, parent} +{ + init(); +} + +void GraphicsView::wheelEvent(QWheelEvent* event) +{ + setTransformationAnchor(GraphicsView::AnchorUnderMouse); + + QPoint pixels = event->pixelDelta(); + QPoint degrees = event->angleDelta(); + const auto oldScenePos = event->scenePosition(); + const auto oldMapped = mapToScene(event->position().toPoint()); + + if (pixels.isNull() && degrees.isNull()) + return; + + const double scaleMultiplier{1.1}; + const auto steps = double(pixels.isNull() ? degrees.y() : pixels.y()); + auto actualScale = std::abs(steps) * scaleMultiplier / + double(QWheelEvent::DefaultDeltasPerStep); + + if (steps < 0) + actualScale = 1 / actualScale; + + scale(actualScale, actualScale); + + event->accept(); +} + +void GraphicsView::init() +{ + setDragMode(QGraphicsView::ScrollHandDrag); + setRenderHint(QPainter::Antialiasing, true); +} |
