Михаиллл
МихаилллШілде 18, 2019, 8:19 Т.Ж.

Как удалять QGraphicsItem попавшие в определенную область на QGraphicsScene

Добрый день.
В этой статье описывается перетаскивание объектов QGraphicsItem , также можно их удалять кодом, описанным ниже.
Но как сделать так, что объект будет удаляться, если при отпускании кнопки мыши, он окажется в определенной области на QGraphicsScene?

void MoveItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    /* При нажатии мышью на графический элемент
     * заменяем курсор на руку, которая держит этот элемента
     * */
    this->setCursor(QCursor(Qt::ClosedHandCursor));
    Q_UNUSED(event);

    //удаление правой кнопкой мыши
    if (QApplication::mouseButtons() == Qt::RightButton)
    {
        qDebug()<<"delete";
        this->deleteLater();
    }
    qDebug()<<"MoveItem";
}
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

13
Pavel K.
  • Шілде 19, 2019, 2:56 Т.Ж.
  • (өңделген)

пропиши состояние обьекта , что -то типо

if(item.y = yAxis && item.x = xAxis) {
this->deleteLater();
}

(надеюсь суть ты уловил)

    Михаиллл
    • Шілде 19, 2019, 10:52 Т.Ж.

    Суть понятна, но не понятно где и как это использовать.
    Как я понимаю для начала нужно получить координату на поле и находящийся эллемент на этой координате в этой части кода

    void MoveItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
    {
        /* При отпускании мышью элемента
         * заменяем на обычный курсор стрелку
         * */
        this->setCursor(QCursor(Qt::ArrowCursor));
        Q_UNUSED(event);
        qDebug()<<"MoveItem";
    }
    

    Сккажите пожалуйста, как это можно сделать?

      Михаиллл
      • Шілде 20, 2019, 8:44 Т.Ж.
      • (өңделген)

      Попробовал сделать так, координаты смещения выдает

      qDebug()<<"position:"<<event->pos();
      

      А если так, то показывает координаты относительно монитора

      qDebug()<<"position:"<<event->screenPos();
      

      Пробовал так, но так в левой верхней части выдает минусы

      qDebug()<<"position:"<<event->scenePos();
      

      Скажите пожалуйста как получить относительно графической сцены?

        Михаиллл
        • Шілде 20, 2019, 9:31 Т.Ж.

        Если не считать касяк с неверным отображением координат, так работает

            if (event->scenePos().x() > 200
                    && event->scenePos().x() < 300
                    && event->scenePos().y() > 200
                    && event->scenePos().y() < 300)
        

        Может быть Вы знаете, почему к сцене добавили по 60 пикселей сверху и слева?

          Pavel K.
          • Шілде 20, 2019, 9:53 Т.Ж.
          • (өңделген)

          Извини что долго , вот

          #include "moveitem.h"
          
          MoveItem::MoveItem(QObject *parent) :
              QObject(parent), QGraphicsItem()
          {
          
          }
          
          MoveItem::~MoveItem()
          {
          
          }
          
          QRectF MoveItem::boundingRect() const
          {
              QRectF item = *new QRectF;
              item.setCoords(-30,-30,60,60);
              return item;
          }
          
          void MoveItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
          {
              painter->setPen(Qt::black);
              painter->setBrush(Qt::green);
              painter->drawRect(-30,-30,60,60);
          
          
              Q_UNUSED(option);
              Q_UNUSED(widget);
          }
          
          void MoveItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
          {
          
              this->setPos(mapToScene(event->pos()));
              // ...чтобы за границы родителя не выходил квадратик
                 if (x() < 0)
                     setPos(0, y());
                 else if (x() > 300)
                     setPos(300, y());
          
                 if (y() < 0)
                     setPos(x(), 0);
                 else if (y() > 300)
                     setPos(x(), 300);
          
          }
          bool MoveItem::checkCoordinates(qreal &_x,qreal &_y)
          {
          // 0.0 0.0 - левый верхний угол, когда туда перемещаешь квадратик - он удаляется
             if( _x == 0.0 && _y == 0.0){
              return  true;
             } else {
              return  false;
             }
          }
          void MoveItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
          {
              /* При нажатии мышью на графический элемент
               * заменяем курсор на руку, которая держит этот элемента
               * */
              this->setCursor(QCursor(Qt::ClosedHandCursor));
              Q_UNUSED(event);
          
              qreal tempX,tempY;
              tempX = this->pos().x();
              tempY = this->pos().y();
                if (QApplication::mouseButtons() == Qt::RightButton ||  checkCoordinates(tempX,tempY))
                {
                      this->deleteLater();
                }
          }
          
          void MoveItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
          {
              /* При отпускании мышью элемента
               * заменяем на обычный курсор стрелку
               * */
              this->setCursor(QCursor(Qt::ArrowCursor));
              Q_UNUSED(event);
          }
          
          
            Pavel K.
            • Шілде 20, 2019, 9:58 Т.Ж.

            я с графическими элементами не работал , поэтому точно не скажу что за 60 пикселей.

              Михаиллл
              • Шілде 20, 2019, 10:50 Т.Ж.

              Спасибо.
              Может быть знаешь как добавить картинку вместо зеленого прямоугольника, а то мой вариант не работает.

                Pavel K.
                • Шілде 20, 2019, 11:03 Т.Ж.
                • (өңделген)

                С гуглом не дружите :D ?

                #include <QGraphicsPixmapItem>
                #include <QFileDialog>
                //- - - - - - - - - - 
                //-----widget.cpp ---
                // - - - - - - - - - -
                
                void Widget::on_pushButton_clicked()
                {
                //    MoveItem *item = new MoveItem();        // Создаём графический элемент 
                     // Добавляем элемент на графическую сцену
                    QString fileNamez = QFileDialog::getOpenFileName(this,"Choose Picture","C:/");
                            QGraphicsPixmapItem *pm = scene->addPixmap( QPixmap(fileNamez) );
                            pm->setPos(0,0);
                
                }
                
                  Михаиллл
                  • Шілде 20, 2019, 11:11 Т.Ж.

                  Дружу, но решил иначе. У меня был касяк с неправильным адресом из ресурсов.

                    Михаиллл
                    • Шілде 21, 2019, 4:03 Т.Ж.

                    Может быть смещение сцены на 60 связанно с нарисованным 4-х угольником?

                      Evgenii Legotckoi
                      • Шілде 21, 2019, 6:07 Т.Ж.

                      Если вы про этот метод

                      QRectF MoveItem::boundingRect() const
                      {
                          return QRectF (-30,-30,60,60);
                      }
                      

                      То мне нужно было, чтобы координата (0,0) была по центру квадрата в его локальной системе координат, тогда метод setPos устанавливает позицию квадрата на графической сцене ровно по центру квадрата. то есть его локальный (0,0) будет лежать например в координате (200,200) при установке позиции через setPos

                        Михаиллл
                        • Шілде 21, 2019, 9:30 Т.Ж.

                        Понятно. Но может ли этот метот объяснить появления 60 пинусовых пикселей по обоим координатам?

                          Evgenii Legotckoi
                          • Шілде 22, 2019, 3:01 Т.Ж.

                          Я отрисовываю квадрат в его локальной системе координат от верхнего левого угла (-30,-30) до его правого нижнего угла (30,30).
                          Поэтому мне нужно указать размеры объекта через boundingRect(), в локальной системе координат объекта.
                          То есть от координаты (-30,-30) при высоте 60 и ширине 60. Поэтому и получается QRectF (-30,-30,60,60);

                            Пікірлер

                            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                            Кіріңіз немесе Тіркеліңіз
                            Г

                            C++ - Тест 001. Первая программа и типы данных

                            • Нәтиже:66ұпай,
                            • Бағалау ұпайлары-1
                            t

                            C++ - Тест 001. Первая программа и типы данных

                            • Нәтиже:33ұпай,
                            • Бағалау ұпайлары-10
                            t

                            Qt - Тест 001. Сигналы и слоты

                            • Нәтиже:52ұпай,
                            • Бағалау ұпайлары-4
                            Соңғы пікірлер
                            G
                            GoattRockҚыр. 3, 2024, 11:50 Т.Қ.
                            Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                            d
                            dblas5Шілде 5, 2024, 9:02 Т.Қ.
                            QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                            k
                            kmssrАқп. 9, 2024, 5:43 Т.Ж.
                            Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                            АК
                            Анатолий КононенкоАқп. 5, 2024, 12:50 Т.Қ.
                            Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                            Енді форумда талқылаңыз
                            Evgenii Legotckoi
                            Evgenii LegotckoiМаусым 25, 2024, 1:11 Т.Ж.
                            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                            F
                            FynjyШілде 22, 2024, 2:15 Т.Қ.
                            при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                            BlinCT
                            BlinCTМаусым 25, 2024, 11 Т.Ж.
                            Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                            BlinCT
                            BlinCTМамыр 5, 2024, 3:46 Т.Қ.
                            Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                            Evgenii Legotckoi
                            Evgenii LegotckoiМамыр 3, 2024, 12:07 Т.Ж.
                            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                            Бізді әлеуметтік желілерде бақылаңыз