Корретная отрисовка в Canvas

This commit is contained in:
2025-12-07 20:49:47 +03:00
parent 0cb599e0e4
commit c9d3a73255
4 changed files with 64 additions and 21 deletions

View File

@@ -84,26 +84,29 @@ void Canvas::mousePressEvent(QMouseEvent* event)
current_line = nullptr;
mode = Mode::None;
obj_count++;
}
update();
return;
}
}
else if (mode == Mode::Parallel) {
Line* found = findAt(scene);
if (!found) {
current_line = nullptr;
update();
return;
}
if (!current_line) {
current_line = found;
update();
return;
}
if (found == current_line){
current_line = nullptr;
update();
return;
}
@@ -111,9 +114,9 @@ void Canvas::mousePressEvent(QMouseEvent* event)
sys.addConstraintParallel(*found, *current_line, constraints_count++);
parallelPairs.insert(makeOrderedPair(found, current_line));
current_line = nullptr;
update();
mode = Mode::None;
}
else {
#ifdef _DEBUG
@@ -125,6 +128,7 @@ void Canvas::mousePressEvent(QMouseEvent* event)
QMessageBox::Ok
);
current_line = nullptr;
update();
return;
}
@@ -136,16 +140,19 @@ void Canvas::mousePressEvent(QMouseEvent* event)
if (!clickedPoint) {
firstPoint = nullptr;
update();
return;
}
if (!firstPoint) {
firstPoint = clickedPoint;
update();
return;
}
if (clickedPoint == firstPoint) {
firstPoint = nullptr;
update();
return;
}
@@ -158,6 +165,7 @@ void Canvas::mousePressEvent(QMouseEvent* event)
if (l1 == l2) {
QMessageBox::warning(this, QString("NO!"), QString("P2P failed"));
firstPoint = nullptr;
update();
return;
}
@@ -172,23 +180,66 @@ void Canvas::mousePressEvent(QMouseEvent* event)
void Canvas::paintEvent(QPaintEvent*)
{
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
p.setRenderHint(QPainter::Antialiasing, true);
// === Решаем систему один раз ===
if (!params.empty()) {
int res = sys.solve(params);
if (res == SolveStatus::Success) {
if (res == SolveStatus::Success || res == SolveStatus::Converged) {
sys.applySolution();
}
else {
#ifdef _DEBUG
qDebug() << "INVAILD LAST CONSTRAINT. REMOVE HIM";
#endif
sys.removeConstraint(sys.get_last_constraint());
constraints_count--;
}
}
for (Line* line : lines) {
line->draw(p);
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));
// Рисуем концы — с учётом выделения
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);
}
// === Подсветка выбранной точки в режиме Coincident ===
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); // маленький центр
}
// === Текущая рисуемая линия (DrawingLine) ===
if (current_line && mode == Mode::DrawingLine) {
QPen pen(Qt::blue, 3, Qt::DashLine);
p.setPen(pen);
p.setBrush(Qt::transparent);
p.drawLine(QPointF(*current_line->p1.x, *current_line->p1.y),
QPointF(*current_line->p2.x, *current_line->p2.y));
// Концы текущей линии — синие точки
p.setBrush(Qt::blue);
p.setPen(Qt::NoPen);
p.drawEllipse(QPointF(*current_line->p1.x, *current_line->p1.y), 6, 6);
p.drawEllipse(QPointF(*current_line->p2.x, *current_line->p2.y), 6, 6);
}
return;
}
Canvas::Canvas(QWidget *parent)