From ad001563fda4a9061909bd09dcf51238138014d6 Mon Sep 17 00:00:00 2001 From: Nikita Kostovsky Date: Fri, 19 Sep 2025 14:28:21 +0200 Subject: initial commit --- src/graphicsview.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/graphicsview.cpp (limited to 'src/graphicsview.cpp') 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 + +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); +} -- cgit v1.2.3-70-g09d2