ДТ
March 29, 2019, 12:32 a.m.

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

Do you like it? Share on social networks!

1
Evgenii Legotckoi
  • March 29, 2019, 6:43 p.m.
  • The answer was marked as a solution.

Добрый день.

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

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

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

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

    Comments

    Only authorized users can post comments.
    Please, Log in or Sign up
    • Last comments
    • AK
      April 1, 2025, 11:41 a.m.
      Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
    • Evgenii Legotckoi
      March 9, 2025, 9:02 p.m.
      К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
    • VP
      March 9, 2025, 4:14 p.m.
      Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
    • ИМ
      Nov. 22, 2024, 9:51 p.m.
      Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
    • Evgenii Legotckoi
      Oct. 31, 2024, 11:37 p.m.
      Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup