0

我有一个填充有 QGraphicsRectItem 元素(小矩形)的 QVector,当用户单击它时,我需要删除一个矩形。我尝试使用removeItem(vec.begin() + i)anddelete vec.begin() + i函数,removeItem(vec[i])and 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]);

 }
4

1 回答 1

1

您正在混合迭代器和向量的实际值:

vec.begin() + i返回一个迭代器,同时vec[i]返回实际值 ( QGraphicsItem*)。对于delete并且removeItem()您只需要vec[i], 而 egerase()将采用迭代器。

当你删除一个 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);
于 2020-04-24T07:19:54.990 回答