ДТ
29 марта 2019 г. 0:32

QPolygon

QPainter, QPolygon, Qt

Возникла небольшая проблемка. Уверен, что это решается довольно легко, но, всё же, никак не могу найти решение.
Хочу нарисовать что-нибудь при помощи полигонов, а для этого я вручную вбиваю координаты треугольников в форму, а понравившиеся сохраняю в лист. Штука в том, что когда я меняю в форме координаты треугольника, перерисовывается старый, а не создаётся новый, это, на самом деле, мне только на руку, но мне нужно знать, как сделать так, чтобы создавался новый. Потому что сейчас я понятия не имею, каким образом мне нужно писать отрисовку по координатам с листа.

  1. void MainWindow::drawTriangle(int x1, int y1, int x2, int y2, int x3, int y3, QPainter *painter, QPolygon *poly)
  2. {
  3. painter->setRenderHint(QPainter::Antialiasing, true);
  4. QPen pen(Qt::gray);
  5. painter->setPen(pen);
  6. *poly << QPoint(width() * x1 * 0.01, height() * y1 * 0.01);
  7. *poly << QPoint(width() * x2 * 0.01, height() * y2 * 0.01);
  8. *poly << QPoint(width() * x3 * 0.01, height() * y3 * 0.01);
  9. }
  10.  
  11. void MainWindow::paintEvent(QPaintEvent *event)
  12. {
  13. QPainter painter(this);
  14. QPolygon poly;
  15. drawTriangle(ui->lineEdit_1->text().toInt(), ui->lineEdit_2->text().toInt(), ui->lineEdit_3->text().toInt(),
  16. ui->lineEdit_4->text().toInt(), ui->lineEdit_5->text().toInt(), ui->lineEdit_6->text().toInt(), &painter, &poly);
  17. painter.drawPolygon(poly);
  18. }
  19.  
  20. void MainWindow::on__go_button_clicked()
  21. {
  22. this->update();
  23. }
  24.  
  25. void MainWindow::on__save_button_clicked()
  26. {
  27. int a[] = {ui->lineEdit_1->text().toInt(), ui->lineEdit_2->text().toInt(), ui->lineEdit_3->text().toInt(),
  28. ui->lineEdit_4->text().toInt(), ui->lineEdit_5->text().toInt(), ui->lineEdit_6->text().toInt()};
  29. for (int i = 5; i >= 0; i--)
  30. list << a[i];
  31. for (int i = 0; i < 6; i++)
  32. {
  33. ui->textEdit->setText(ui->textEdit->toPlainText() + QString::number(list.takeLast()) + "\n");
  34. }
  35. }
2

Вам это нравится? Поделитесь в социальных сетях!

1
Evgenii Legotckoi
  • 29 марта 2019 г. 18:43
  • Ответ был помечен как решение.

Добрый день.

Вам для этого нужно использовать графическую сцену QGraphicsScene и добавлять на неё графические элементы QGaphicsItem - это будет наиболее правильным решение в вашем случае.

Там просто нужно будет наследоваться от QGraphicsItem и переопределить метод paint.

Вот несколько статей, где это подробно описывается

А в вашем случае вы просто переустанавливаете точки, которые при каждом обновлении окна отрисовываются снова, таким образом рисунок в окне перерисовывается. Но это не является самостоятельным объектом.

    Комментарии

    Только авторизованные пользователи могут публиковать комментарии.
    Пожалуйста, авторизуйтесь или зарегистрируйтесь
    • Последние комментарии
    • Evgenii Legotckoi
      16 апреля 2025 г. 17:08
      Благодарю за отзыв. И вам желаю всяческих успехов!
    • IscanderChe
      12 апреля 2025 г. 17:12
      Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
    • AK
      1 апреля 2025 г. 11:41
      Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
    • Evgenii Legotckoi
      9 марта 2025 г. 21:02
      К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
    • VP
      9 марта 2025 г. 16:14
      Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…