July 18, 2019, 7:19 a.m.

Как удалять 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";
}
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
13

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#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);
}

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

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

С гуглом не дружите :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);

}

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

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

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

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

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

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

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting Timeweb
g
May 29, 2020, 2:32 p.m.
glushchenkoin

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:40points,
  • Rating points-8
AS
May 26, 2020, 11:29 a.m.
Artem Sun-Dun-Chan

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
MN
May 25, 2020, 11:33 a.m.
Mitja Nagibin

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
Last comments
May 31, 2020, 8:15 a.m.
IscanderChe

Как установить OpenCV на Qt под Windows

Добавлю от себя: на Windows 10 x64 с MinGW 7.3.0 в CMake надо установить флаг OPENCV_ENABLE_ALLOCATOR_STATS=OFF, тогда всё скомпилится нормально.
May 29, 2020, 1 p.m.
Evgenij Legotskoj

Django - Tutorial 023. Like Dislike system using GenericForeignKey

Думал так, но похоже что нет. {{ post.votes.likes.user.username }} Это же QuerySet будет, а не отдельный единственный объект {% for vote in post.votes %} {{ vote.user.username …
May 29, 2020, 11:43 a.m.
Vladislav Melenchuk

Django - Tutorial 023. Like Dislike system using GenericForeignKey

А как получить имя пользователя, который поставил лайк? Думал так, но похоже что нет. {{ post.votes.likes.user.username }}
May 29, 2020, 6:30 a.m.
Evgenij Legotskoj

Qt/C++ - Lesson 039. How to paint stroke in QSqlTableModel by value in the column?

У меня работает. Исправлял в проекте, который приложен к статье. А что происходит в вашем коде, с учётом места вызова этого кода, я знать не могу ;) Дебажьте и добавляйте условия, кото…
Now discuss on the forum
May 31, 2020, 6:57 a.m.
Aleksej Vnukov

Минимальный размер Item

считайте по размеру включенных элементов, чтоб все помещалась. например у вас всего 2 кнопки, тогда минимальный размер итема будет ширина 1-й кнопки + ширина 2-й кнопки + отступы, и точно также …
f
May 31, 2020, 2:24 a.m.
fryn3

Можно ли сделать в QML таблицу как в Excel?

Можно ли сделать в QML таблицу как в Excel или как сделано в QTableView? Что бы можно было выделять диапазон ячеек, переключатся по таб, изменять размеры строк и столбцов. В QT 5.14 по…
S
RS
May 30, 2020, 11:49 a.m.
Ruslan Skljuev

QML Как при нажатии на кнопку изменить название окна?

У меня три файла: 1. QML - это Loader и Window 2. QML вход в программу - страница Loader (там есть Switch) 3. QML - MainMenu. Мне нужно в (1), чтобы если на (2) Switch.enable, то …
DK
May 29, 2020, 1:27 p.m.
Dzhon Kofi

QMap<> какой ключ лучше

это ясно. Вопрос в том, как быстро мапа будет отрабатывать, если ключом будет QModelIndex. Какой параметр индекса возьмет за ключ. И вот насколько это будет медленнее или быстрее, чем QString пр…
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB