Как удалить QGraphicsRectItem из QVector?
У меня есть 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 ответ
Вы смешиваете итераторы и фактические значения своего вектора:
vec.begin() + i
возвращает итератор, а vec[i]
возвращает фактическое значение (QGraphicsItem*
). Заdelete
а также removeItem()
тебе просто нужно vec[i]
, а например erase()
взял бы итератор.
Когда вы удаляете QGraphicsItem, он автоматически удаляется со сцены, поэтому вам не нужно вызыватьremoveItem()
явно.
Итак, чтобы удалить все элементы в vec (и очистить vec), вы можете:
for (int i = 0; i < vec.size(); ++i)
delete vec[i];
vec.clear();
Или короче:
qDeleteAll(vec);
vec.clear();
Чтобы удалить один элемент без зацикливания:
delete vec.take(index);