Реализация scalling-а

This commit is contained in:
2025-12-22 22:54:07 +03:00
parent eed4a3088d
commit 8d16135a9b
2 changed files with 41 additions and 2 deletions

View File

@@ -49,6 +49,26 @@ void Canvas::changeMode(Mode _mode)
mode = _mode;
}
void Canvas::zoomIn()
{
scaleFactor += ZOOM_STEP;
update();
}
void Canvas::zoomOut()
{
scaleFactor -= ZOOM_STEP;
if (scaleFactor < 0.1) // Минимальный масштаб 10%
scaleFactor = 0.1;
update();
}
void Canvas::zoomReset()
{
scaleFactor = 1.0;
update();
}
// ===================================================================
// Методы поиска и проверки
// ===================================================================
@@ -567,7 +587,7 @@ void Canvas::paintEvent(QPaintEvent* event)
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing, true);
p.translate(width() / 2.0, height() / 2.0);
p.scale(1.0, -1.0);
p.scale(scaleFactor, -scaleFactor);
p.setPen(Qt::red);
p.drawLine(-5, 0, 5, 0);
@@ -680,7 +700,14 @@ void Canvas::keyPressEvent(QKeyEvent* event)
}
break;
}
case Qt::Key_Plus:
zoomIn();
break;
case Qt::Key_Minus:
zoomOut();
break;
default:
QWidget::keyPressEvent(event);
}
@@ -717,7 +744,8 @@ QPointF Canvas::screenToLogical(const QPointF& screenPos) const
logical.rx() -= width() / 2.0;
logical.ry() -= height() / 2.0;
logical.ry() = -logical.ry();
logical.rx() /= scaleFactor;
logical.ry() /= -scaleFactor;
return logical;
}

View File

@@ -1,5 +1,6 @@
#pragma once
constexpr auto EPS = 1e-9;
constexpr auto ZOOM_STEP = 0.05;
#include <QWidget>
#include <QMouseEvent>
@@ -54,6 +55,15 @@ public:
/// Изменить текущий режим работы
void changeMode(Mode newMode);
/// Увеличить масштаб
void zoomIn();
/// Уменьшить масштаб
void zoomOut();
/// Сбросить масштаб к 100%
void zoomReset();
protected:
// Обработчики событий Qt
void mousePressEvent(QMouseEvent* event) override;
@@ -132,6 +142,7 @@ private:
// ====================== Флаги состояния ======================
bool after_constraint{ false }; ///< Флаг, что только что добавлено ограничение
double scaleFactor { 1.0 };
// ====================== Счётчики ======================