Михаиллл
МихаилллШілде 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);

                            Пікірлер

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

                            C++ - Тест 004. Указатели, Массивы и Циклы

                            • Нәтиже:50ұпай,
                            • Бағалау ұпайлары-4
                            m
                            • molni99
                            • Қаз. 26, 2024, 1:37 Т.Ж.

                            C++ - Тест 004. Указатели, Массивы и Циклы

                            • Нәтиже:80ұпай,
                            • Бағалау ұпайлары4
                            m
                            • molni99
                            • Қаз. 26, 2024, 1:29 Т.Ж.

                            C++ - Тест 004. Указатели, Массивы и Циклы

                            • Нәтиже:20ұпай,
                            • Бағалау ұпайлары-10
                            Соңғы пікірлер
                            ИМ
                            Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
                            Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                            Evgenii Legotckoi
                            Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
                            Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                            A
                            ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
                            Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                            ИМ
                            Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
                            Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                            d
                            dblas5Шілде 5, 2024, 11:02 Т.Ж.
                            QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                            Енді форумда талқылаңыз
                            m
                            moogoҚар. 22, 2024, 7:17 Т.Ж.
                            Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                            Evgenii Legotckoi
                            Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                            t
                            tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
                            google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                            NSProject
                            NSProjectМаусым 4, 2022, 3:49 Т.Ж.
                            Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

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