Return ToolTip to code

Оптимизирован paintEvent
This commit is contained in:
2025-12-26 13:28:37 +03:00
parent fb52cce809
commit 2432756921
2 changed files with 76 additions and 35 deletions

View File

@@ -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 }; ///< Текущий режим работы

View File

@@ -1,6 +1,7 @@
#include "Canvas.h"
std::set<Point*> 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;
}