QTscene->removeItem(*QgraphicsItem)从场景中移除对象但它仍然被观察到

问题描述

我正在使用 QT c ++ 创建一个简单的游戏,我有一个小行星类和一个该类的 Qvector。每 15 秒创建一个小行星并将其添加到 Qvector。

void MainWindow::generarasteroides(){
     srand(time(NULL));
     int aleatorio=1+rand()%1000;
     int a_w = 30+rand()%200;
     v_asteroides.push_back(new asteroides(aleatorio,-1000,a_w,500));
     mundo->addItem(v_asteroides.last());
     std::cout << "Asteroide generado en X : "<< aleatorio << std::endl;
     sonido->stop();
     sonido->setMedia(QUrl("qrc:/multimedia/suspenso1.mp3"));
     sonido->play();

}

当它超过某个 Y 坐标时,我通过 Timer 调用一个函数来遍历向量并从场景中消除

void MainWindow::actualizar(){
for(auto &ast : v_asteroides){
    if(ast->destruir()){

        mundo->removeItem(ast);
        v_asteroides.erase(std::remove(v_asteroides.begin(),v_asteroides.end(),ast),v_asteroides.end());
        sonido->stop();
        sonido->setMedia(QUrl("qrc:/multimedia/explosion1.mp3"));
        sonido->play();
        //std::cout << "eliminado" <<std::endl;
    }
}

//std::cout << "tamaño : " <<v_asteroides.size() << std::endl;
mundo->advance();
mundo->update();}

然而,应该从屏幕上移除的对象仍然存在(静止)而不会消失。

解决方法

错误在于:for (xx : vs_) 和 vs_.erase 不能一起使用。 您应该在下一个循环中使用 v_asteroides.erase(xxx) 返回的迭代器。

按照建议使用下一个代码:

auto iter = vs_.begin();
    for (; iter != vs_.end(); )
    {
        //if need erase
        {
            //other logic code
            // mundo->removeItem(*iter);
            iter = vs_.erase(iter);  // at last row         
        }
        // else
        {
            //++iter;
        }

    }