From 2432756921c1765eccf021d891acdfc99bbb3103 Mon Sep 17 00:00:00 2001 From: ParkSuMin Date: Fri, 26 Dec 2025 13:28:37 +0300 Subject: [PATCH] Return ToolTip to code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Оптимизирован paintEvent --- include/Canvas.h | 3 +- src/Canvas.cpp | 108 ++++++++++++++++++++++++++++++++--------------- 2 files changed, 76 insertions(+), 35 deletions(-) diff --git a/include/Canvas.h b/include/Canvas.h index 9c5489b..369c040 100644 --- a/include/Canvas.h +++ b/include/Canvas.h @@ -221,7 +221,6 @@ private: // ====================== Данные для перемещения объектов ====================== Point* draggedPoint{ nullptr }; ///< Точка, которую перемещают - Line* draggedLine{ nullptr }; ///< Линия, которую перемещают Curve* draggedCurve { nullptr }; QPointF dragOffset; ///< Смещение при начале перемещения @@ -242,7 +241,7 @@ private: // ====================== Временные данные для режимов ====================== Line* current_line{ nullptr }; ///< Текущая линия в режимах рисования/параллельности Circle* current_circle{ nullptr }; - Curve* current_curve { nullptr }; + Curve* current_curve { nullptr }; ///< Используется при выборе ещё неизвестной системе кривой Point* firstPoint{ nullptr }; ///< Первая точка в режиме совпадения Mode mode{ Mode::None }; ///< Текущий режим работы diff --git a/src/Canvas.cpp b/src/Canvas.cpp index f372633..a7d97be 100644 --- a/src/Canvas.cpp +++ b/src/Canvas.cpp @@ -1,6 +1,7 @@ #include "Canvas.h" std::set groups; +static QPointF scene; // =================================================================== // Вспомогательные функции @@ -283,6 +284,18 @@ void Canvas::mousePressEvent(QMouseEvent* event) void Canvas::mouseMoveEvent(QMouseEvent* event) { + if (current_line) { + scene = UCS_POSITION; + update(); + return; + } + + if (current_circle) { + scene = UCS_POSITION; + update(); + return; + } + // ====================== Перемещение точки ====================== if (draggedPoint) { QPointF pos = UCS_POSITION - dragOffset; @@ -384,69 +397,86 @@ void Canvas::paintEvent(QPaintEvent* event) QPainter p(this); p.setRenderHint(QPainter::Antialiasing, true); + + // Центрирование и масштабирование координат p.translate(width() / 2.0, height() / 2.0); p.scale(scaleFactor, -scaleFactor); + // Оси координат (красные, всегда рисуются первыми) p.setPen(Qt::red); p.drawLine(-5, 0, 5, 0); p.drawLine(0, -5, 0, 5); - // ====================== Отрисовка линий ====================== - + // ====================== Отрисовка всех кривых ====================== for (Curve* curve : curves) { if (Line* line = CURVE_AS_LINE(curve)) { + // Выделение линии в режиме Parallel bool isSelected = (mode == Mode::Parallel && line == current_line); - - // Настройка пера для линии QPen linePen = isSelected ? QPen(Qt::red, 4) : QPen(Qt::black, 2); p.setPen(linePen); - // Рисуем линию - p.drawLine( - QPointF(*line->p1.x, *line->p1.y), - QPointF(*line->p2.x, *line->p2.y) - ); + // Сама линия + p.drawLine(QPointF(*line->p1.x, *line->p1.y), + QPointF(*line->p2.x, *line->p2.y)); - // Рисуем конечные точки линии + // Конечные точки линии QBrush pointBrush = isSelected ? QBrush(Qt::red) : QBrush(Qt::darkBlue); p.setBrush(pointBrush); p.setPen(Qt::NoPen); - p.drawEllipse(QPointF(*line->p1.x, *line->p1.y), 5, 5); p.drawEllipse(QPointF(*line->p2.x, *line->p2.y), 5, 5); } else if (Circle* circle = CURVE_AS_CIRCLE(curve)) { + // Контур окружности p.setPen(QPen(Qt::black, 2)); p.setBrush(Qt::NoBrush); - p.drawEllipse(QPointF(*circle->center.x, *circle->center.y), *circle->rad, *circle->rad); + // Точка центра p.setBrush(QBrush(Qt::darkBlue)); p.setPen(Qt::NoPen); p.drawEllipse(QPointF(*circle->center.x, *circle->center.y), 5, 5); - p.setBrush(Qt::NoBrush); } } // ====================== Подсветка выбранной точки (режим Coincedent) ====================== if (mode == Mode::Coincedent && firstPoint) { QPointF pt(*firstPoint->x, *firstPoint->y); + p.setPen(Qt::NoPen); p.setBrush(Qt::red); p.drawEllipse(pt, 12, 12); + p.setBrush(Qt::white); p.drawEllipse(pt, 8, 8); + p.setBrush(Qt::red); - p.drawEllipse(pt, 4, 4); // маленький центр + p.drawEllipse(pt, 4, 4); } // ====================== Отрисовка текущей линии (режим DrawingLine) ====================== if (current_line && mode == Mode::DrawingLine) { - // Рисуем начальную точку текущей линии - p.setBrush(Qt::blue); p.setPen(Qt::NoPen); + p.setBrush(Qt::blue); p.drawEllipse(QPointF(*current_line->p1.x, *current_line->p1.y), 6, 6); + + p.setPen(Qt::DashLine); + p.setBrush(Qt::NoBrush); + p.drawLine(QPointF(*current_line->p1.x, *current_line->p1.y), scene); + } + // ====================== Отрисовка текущей окружности (режим DrawingCircle) ====================== + else if (current_circle && mode == Mode::DrawingCircle) { + QPointF center(*current_circle->center.x, *current_circle->center.y); + double current_radius = dist_P2P(center, scene); + + p.setPen(Qt::NoPen); + p.setBrush(Qt::blue); + p.drawEllipse(center, 5, 5); + + p.setPen(QPen(Qt::black, 1, Qt::DashLine)); + p.setBrush(Qt::NoBrush); + p.drawEllipse(center, current_radius, current_radius); } } @@ -540,19 +570,31 @@ void Canvas::leaveEvent(QEvent* event) #ifdef _DEBUG void Canvas::showObjectTag(QPointF pos) { - //QPointF l = screenToLogical(pos); - //Line* lineUnderCursor = findAt(l, 1.0); - //if (lineUnderCursor && lineUnderCursor != draggedLine) { - // QPointF p1(*lineUnderCursor->p1.x, *lineUnderCursor->p1.y); - // QPointF p2(*lineUnderCursor->p2.x, *lineUnderCursor->p2.y); - // QLineF info_line(p1, p2); - // QString Text = QString("Line %1\nLength = %2mm") - // .arg(lineUnderCursor->get_tag() + 1) - // .arg(info_line.length()); - // QToolTip::showText(mapToGlobal(pos.toPoint()), Text, this); - //} - //else - // QToolTip::hideText(); + QPointF l = screenToLogical(pos); + Curve* curveUnderCursor = findAt(l, 1.0); + if (Line* line = CURVE_AS_LINE(curveUnderCursor)) { + if (line != draggedCurve) { + QPointF p1(*line->p1.x, *line->p1.y); + QPointF p2(*line->p2.x, *line->p2.y); + QLineF info_line(p1, p2); + QString Text = QString("Line %1\nLength = %2mm") + .arg(line->get_tag() + 1) + .arg(info_line.length()); + QToolTip::showText(mapToGlobal(pos.toPoint()), Text, this); + } + } + else if (Circle* circle = CURVE_AS_CIRCLE(curveUnderCursor)) { + if (circle != draggedCurve) { + QPointF center(*circle->center.x, *circle->center.y); + double current_radius = *circle->rad; + QString Text = QString("Circle %1\nRadius = %2mm") + .arg(circle->get_tag() + 1) + .arg(current_radius); + QToolTip::showText(mapToGlobal(pos.toPoint()), Text, this); + } + } + else + QToolTip::hideText(); } #endif @@ -686,7 +728,7 @@ void Canvas::clearCanvas() } draggedPoint = nullptr; - draggedLine = nullptr; + draggedCurve = nullptr; // Сброс режима mode = Mode::None; @@ -731,7 +773,7 @@ void Canvas::ON_NONE(QPointF* scene) void Canvas::ON_LINE(QPointF* pos) { - QPointF scene = *pos; + scene = *pos; if (!current_line) { // Первый клик: создаем новую линию @@ -804,7 +846,7 @@ void Canvas::ON_LINE(QPointF* pos) } void Canvas::ON_CIRCLE(QPointF* pos) { - QPointF scene = *pos; + scene = *pos; if (!current_circle) { current_circle = new Circle(); // Создаем координаты для центра окружности @@ -826,8 +868,8 @@ void Canvas::ON_CIRCLE(QPointF* pos) current_circle->rad = r; params.push_back(r); - curves.append(current_circle); current_circle->set_tag(obj_count++); + curves.append(current_circle); current_circle = nullptr; mode = Mode::None; }