Реализация scalling-а
This commit is contained in:
32
Canvas.cpp
32
Canvas.cpp
@@ -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);
|
||||
@@ -681,6 +701,13 @@ 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;
|
||||
}
|
||||
|
||||
11
Canvas.h
11
Canvas.h
@@ -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 };
|
||||
|
||||
// ====================== Счётчики ======================
|
||||
|
||||
|
||||
Reference in New Issue
Block a user