Как удалить QGraphicsRectItem из QVector? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть QVector, заполненный элементами QGraphicsRectItem (маленькие прямоугольники), и мне нужно удалить один единственный прямоугольник, когда пользователь нажимает на него. Я пытался использовать функции removeItem(vec.begin() + i) и delete vec.begin() + i, removeItem(vec[i]) и delete vec[i], vec.erase(vec.begin() + 1). Но в первом случае программа выводит сообщение:

C:\Users\1\Documents\my_game\myscene.cpp:24: error: no matching function for call to 'myscene::removeItem(QVector<QGraphicsRectItem*>::iterator)' removeItem(vec.begin() + i);

Во втором случае, когда я нажимаю на прямоугольник, он удаляет все прямоугольники.

А в третьем случае это просто не не работает.

Не могли бы вы посоветовать мне другой способ решения моей проблемы?

Вот код:

   #include "myscene.h"

   #include <QGraphicsRectItem>
   #include <QGraphicsScene>
   #include <QTimer>
   #include <QVector>

   #include <ctime>

   #include <QGraphicsSceneMouseEvent>

   myscene::myscene(QObject *parent)

   {

    srand(time(NULL));

    QTimer *t = new QTimer;

    t->setInterval(1000);

    connect(t, SIGNAL(timeout()), this, SLOT(addrect1()));

    t->start();

   }

  void myscene::mousePressEvent(QGraphicsSceneMouseEvent *event)
  {

    int x1 = event->scenePos().x();

    int y1 = event->scenePos().y();

    for(int i=0; i<vec.size(); i++){

            if ((x1=vec_x[i])&&(y1=vec_y[i])) {

                removeItem(vec.begin() + i);

                delete  vec.begin() + i;

        }

    }

  }


  myscene::addrect1()
  {

    QGraphicsRectItem *newRECT = new QGraphicsRectItem;

     x=rand()%481-240;

    y=rand()%481-240;

    newRECT->setRect(x,y,10,10);

    vec.push_back(newRECT);

    vec_x.push_back(x);

    vec_y.push_back(y);

    this->addItem(vec[vec.size()-1]);

 }

1 Ответ

0 голосов
/ 24 апреля 2020

Вы смешиваете итераторы и фактические значения вашего вектора:

vec.begin() + i возвращает итератор, а vec[i] возвращает фактическое значение (QGraphicsItem*). Для delete и removeItem() вам просто нужно vec[i], в то время как, например, erase() займет итератор.

Когда вы удаляете QGraphicsItem, он автоматически удаляется со сцены, поэтому вам не нужно явно вызывать removeItem().

Поэтому для удаления всех элементов в ve c (и очистки ve c) вы можете сделать:

for (int i = 0; i < vec.size(); ++i)
    delete vec[i];
vec.clear();

Или, короче:

qDeleteAll(vec);
vec.clear();

Чтобы удалить один элемент без зацикливания:

delete vec.take(index);
...