diff options
| author | Nikita Kostovsky <nikita@kostovsky.me> | 2025-09-19 14:28:21 +0200 |
|---|---|---|
| committer | Nikita Kostovsky <nikita@kostovsky.me> | 2025-09-19 21:04:04 +0200 |
| commit | ad001563fda4a9061909bd09dcf51238138014d6 (patch) | |
| tree | 5394cc0436d6ef811b6b791c37a233047c99247d /src/graphicsview.cpp | |
initial commit
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); +} |
