Михаиллл
June 13, 2019, 12:05 p.m.

Рисование в QGraphicsScene, как выделить объект

Добрый день.
Рисую в QGraphicsScene мышкой, ниже код сцены (сделан на основе урока).
В Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью описан вариант перетаскивания. Скажите пожалуйста как можно подключить этот вариант перетаскивания к описаному варианту рисования?
h

  1. #ifndef PAINTSCENE_H
  2. #define PAINTSCENE_H
  3.  
  4. #include <QGraphicsScene>
  5. #include <QGraphicsSceneMouseEvent>
  6. #include "QGraphicsView"
  7. #include <QTimer>
  8. #include <QDebug>
  9. //#include "QLabel"
  10. //#include "QPainter"
  11.  
  12.  
  13.  
  14.  
  15. class paintScene : public QGraphicsScene
  16. {
  17.  
  18. Q_OBJECT
  19.  
  20. public:
  21. explicit paintScene(QObject *parent = 0);
  22. ~paintScene();
  23. QPen myPen;
  24. //переменная для режима рисования или перепещения с удалением
  25. QString paintOrDelete = "рисовать"; //"удалять, перетаскивать"
  26.  
  27. //QGraphicsView *myQGraphicsScene;
  28. //paintScene *scene; // Объявляем кастомную графическую сцену
  29. //QPainter test
  30. //QPainter myPainter;
  31.  
  32. //int x,y;
  33. //void paintEvent(QPaintEvent *event);
  34.  
  35.  
  36. private:
  37. QPointF previousPoint; // Координаты предыдущей точки
  38. bool buttonIsPressed;
  39.  
  40. private:
  41. // Для векторного рисования используем события мыши
  42. //временно срыл рисование векторной графики
  43. void mousePressEvent(QGraphicsSceneMouseEvent * event);
  44. void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
  45. void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
  46.  
  47. };
  48.  
  49. #endif // PAINTSCENE_H
  50.  

cpp

  1. #include "paintscene.h"
  2.  
  3.  
  4. paintScene::paintScene(QObject *parent) : QGraphicsScene(parent)
  5. {
  6. //myQGraphicsScene = new QGraphicsView();
  7. //scene = new paintScene(); // Инициализируем графическую сцену
  8.  
  9. //Pen
  10. myPen.setWidth(20);
  11. myPen.setColor(Qt::green);
  12. //myPen.setColor(QColor(255, 0, 0, 10));
  13. myPen.setCapStyle(Qt::RoundCap);
  14. myPen.setStyle(Qt::SolidLine);
  15.  
  16. }
  17.  
  18. paintScene::~paintScene()
  19. {
  20.  
  21. }
  22.  
  23. void paintScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
  24. {
  25. if (paintOrDelete == "рисовать")
  26. {
  27. // При нажатии кнопки мыши отрисовываем эллипс
  28. addEllipse(event->scenePos().x() - myPen.width()/2,
  29. event->scenePos().y() - myPen.width()/2,
  30. myPen.width(),
  31. myPen.width(),
  32. QPen(Qt::NoPen),
  33. QBrush(myPen.color()));
  34. // Сохраняем координаты точки нажатия
  35. previousPoint = event->scenePos();
  36. buttonIsPressed = true;
  37.  
  38.  
  39. //для рисования попиксельно
  40. //x = event->scenePos().x();
  41. //y = event->scenePos().x();
  42. }
  43. /*if (paintOrDelete == "удалять, перетаскивать")
  44. {
  45. /* При нажатии мышью на графический элемент
  46. * заменяем курсор на руку, которая держит этот элемента
  47. * */
  48. /*this->setCursor(QCursor(Qt::ClosedHandCursor));
  49. Q_UNUSED(event);
  50.  
  51. //удаление правой кнопкой мыши
  52. if (QApplication::mouseButtons() == Qt::RightButton)
  53. {
  54. this->deleteLater();
  55. }
  56. }*/
  57. }
  58.  
  59. void paintScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
  60. {
  61. //if (paintOrDelete == "рисовать")
  62. {
  63. if (buttonIsPressed)
  64. {
  65. // Отрисовываем линии с использованием предыдущей координаты
  66. addLine(previousPoint.x(),
  67. previousPoint.y(),
  68. event->scenePos().x(),
  69. event->scenePos().y(),
  70. myPen);
  71. // Обновляем данные о предыдущей координате
  72. previousPoint = event->scenePos();
  73. }
  74. }
  75. /*if (paintOrDelete == "удалять, перетаскивать")
  76. {
  77. /* Устанавливаем позицию графического элемента
  78. * в графической сцене, транслировав координаты
  79. * курсора внутри графического элемента
  80. * в координатную систему графической сцены
  81. * */
  82. /*this->setPos(mapToScene(event->pos()));
  83. }*/
  84. }
  85.  
  86. void paintScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
  87. {
  88. buttonIsPressed = false;
  89. /*if (paintOrDelete == "удалять, перетаскивать")
  90. {
  91. /* При отпускании мышью элемента
  92. * заменяем на обычный курсор стрелку
  93. * */
  94. /*this->setCursor(QCursor(Qt::ArrowCursor));
  95. Q_UNUSED(event);
  96. }*/
  97. }
  98.  
2
The question is asked by the articleQt/C++ - Lesson 023. Moving QGraphicsItem on QGraphicsScene with mouse help

Do you like it? Share on social networks!

3
Evgenii Legotckoi
  • June 17, 2019, 3 a.m.

Дорбрый день.

К этому варианту с графической сценой лучше тот код вообще не прикручивать. Вы видите разницу меджу вашим кодом и кодом в примере?

В примере предлагается переопределить класс QGraphicsItem, а вы хотите прикрутить тот код к графической сцене. Вы только так усложните себе жизнь.

По факту, вам нужно заменить добавление линий, которое вы делаете через addLine, на методы addItem. И добавлять через метод addItem кастомный класс графической линии, в котором будет реализовано перемещении объектов, как было показано в той статье.

Либо устанавливать флаг перемещаемости для графического объекта. Возможно, что вам такого хватит

  1. void Widget::on_pushButton_clicked()
  2. {
  3. MoveItem *item = new MoveItem(); // Создаём графический элемент
  4. item->setPos(randomBetween(30, 470), // Устанавливаем случайную позицию элемента
  5. randomBetween(30, 470));
  6.  
  7. item->setFlag(QGraphicsItem::ItemIsMovable); // делаем элемент перемещаемым
  8.  
  9. scene->addItem(item); // Добавляем элемент на графическую сцену
  10. }
    Михаиллл
    • June 19, 2019, 6:55 p.m.

    Скажите пожалуйста, как его в таком случае перемещать и удалять?

      Evgenii Legotckoi
      • June 24, 2019, 3:50 p.m.

      Обычно я этот

      1. MoveItem *item

      помещаю в вектор std::vector m_items; потом по сигналам нажатия выдёргиваю из веторов и удаляю. Есть пример удаления в одном из уроков по написанию игры

      Смотрите слот для удаления яблок.

        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