首页 > 解决方案 > QT scene->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,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();}

但是,应该从屏幕上删除的对象仍然存在(仍然)而不会消失。

标签: c++qtqgraphicssceneqgraphicsitem

解决方案


错误是: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;
        }

    }

推荐阅读