Реализация scalling-а
This commit is contained in:
32
Canvas.cpp
32
Canvas.cpp
@@ -49,6 +49,26 @@ void Canvas::changeMode(Mode _mode)
|
|||||||
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);
|
QPainter p(this);
|
||||||
p.setRenderHint(QPainter::Antialiasing, true);
|
p.setRenderHint(QPainter::Antialiasing, true);
|
||||||
p.translate(width() / 2.0, height() / 2.0);
|
p.translate(width() / 2.0, height() / 2.0);
|
||||||
p.scale(1.0, -1.0);
|
p.scale(scaleFactor, -scaleFactor);
|
||||||
|
|
||||||
p.setPen(Qt::red);
|
p.setPen(Qt::red);
|
||||||
p.drawLine(-5, 0, 5, 0);
|
p.drawLine(-5, 0, 5, 0);
|
||||||
@@ -680,7 +700,14 @@ void Canvas::keyPressEvent(QKeyEvent* event)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case Qt::Key_Plus:
|
||||||
|
zoomIn();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Qt::Key_Minus:
|
||||||
|
zoomOut();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
QWidget::keyPressEvent(event);
|
QWidget::keyPressEvent(event);
|
||||||
}
|
}
|
||||||
@@ -717,7 +744,8 @@ QPointF Canvas::screenToLogical(const QPointF& screenPos) const
|
|||||||
logical.rx() -= width() / 2.0;
|
logical.rx() -= width() / 2.0;
|
||||||
logical.ry() -= height() / 2.0;
|
logical.ry() -= height() / 2.0;
|
||||||
|
|
||||||
logical.ry() = -logical.ry();
|
logical.rx() /= scaleFactor;
|
||||||
|
logical.ry() /= -scaleFactor;
|
||||||
|
|
||||||
return logical;
|
return logical;
|
||||||
}
|
}
|
||||||
|
|||||||
11
Canvas.h
11
Canvas.h
@@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
constexpr auto EPS = 1e-9;
|
constexpr auto EPS = 1e-9;
|
||||||
|
constexpr auto ZOOM_STEP = 0.05;
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
@@ -54,6 +55,15 @@ public:
|
|||||||
/// Изменить текущий режим работы
|
/// Изменить текущий режим работы
|
||||||
void changeMode(Mode newMode);
|
void changeMode(Mode newMode);
|
||||||
|
|
||||||
|
/// Увеличить масштаб
|
||||||
|
void zoomIn();
|
||||||
|
|
||||||
|
/// Уменьшить масштаб
|
||||||
|
void zoomOut();
|
||||||
|
|
||||||
|
/// Сбросить масштаб к 100%
|
||||||
|
void zoomReset();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Обработчики событий Qt
|
// Обработчики событий Qt
|
||||||
void mousePressEvent(QMouseEvent* event) override;
|
void mousePressEvent(QMouseEvent* event) override;
|
||||||
@@ -132,6 +142,7 @@ private:
|
|||||||
// ====================== Флаги состояния ======================
|
// ====================== Флаги состояния ======================
|
||||||
|
|
||||||
bool after_constraint{ false }; ///< Флаг, что только что добавлено ограничение
|
bool after_constraint{ false }; ///< Флаг, что только что добавлено ограничение
|
||||||
|
double scaleFactor { 1.0 };
|
||||||
|
|
||||||
// ====================== Счётчики ======================
|
// ====================== Счётчики ======================
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user