C++ 检测到冲突后删除用户定义的qGraphicItems
我有一个子弹类,我想在击中任何东西时删除它,但如果它击中敌人,我想它也删除敌人。它在我的桌面上工作,但在切换到我的笔记本电脑时,每当它被移除时,它就开始崩溃。当前,我的场景位于Dialog.cpp中的另一个类中 这是我的密码: bullet.cppC++ 检测到冲突后删除用户定义的qGraphicItems,c++,qt,qgraphicsitem,qgraphicsscene,C++,Qt,Qgraphicsitem,Qgraphicsscene,我有一个子弹类,我想在击中任何东西时删除它,但如果它击中敌人,我想它也删除敌人。它在我的桌面上工作,但在切换到我的笔记本电脑时,每当它被移除时,它就开始崩溃。当前,我的场景位于Dialog.cpp中的另一个类中 这是我的密码: bullet.cpp void bullet::DoCollision() { QList<QGraphicsItem *> list = collidingItems() ; foreach(QGraphicsItem * i , list
void bullet::DoCollision()
{
QList<QGraphicsItem *> list = collidingItems() ;
foreach(QGraphicsItem * i , list)
{
if (i->type() == 3)
{
QGraphicsItem * item= i;
delete item;
qDebug() << "bye";
}
}
m_FireTimer->stop();
delete this;
}
void bullet::DoCollision()
{
QList list=冲突项();
foreach(QGraphicsItem*i,列表)
{
如果(i->type()==3)
{
QGraphicsItem*项目=i;
删除项目;
qDebug()停止();
删除此项;
}
您应该使用qgraphicscene::removietem(QGraphicsItem*item)
从场景中删除该项及其所有子项。您应该在变量中保持指向场景的指针,如myScene
您的代码应该如下所示:
void bullet::DoCollision()
{
QList<QGraphicsItem *> list = collidingItems() ;
foreach(QGraphicsItem * i , list)
{
if (i->type() == 3)
{
QGraphicsItem * item= i;
myScene->removeItem(item);
delete item;
qDebug() << "bye";
}
}
m_FireTimer->stop();
delete this;
}
void bullet::DoCollision()
{
QList list=冲突项();
foreach(QGraphicsItem*i,列表)
{
如果(i->type()==3)
{
QGraphicsItem*项目=i;
myScene->removietem(项目);
删除项目;
qDebug()停止();
删除此项;
}
我认为没有任何东西会立即崩溃。但是:删除内容后,您可能希望将其设置为NULL,这样它们就不会被意外删除两次(例如,在您的类的dtor中)。您可以使用替换循环。在家中,我可以继续运行并显示“You win”在我的笔记本电脑上杀死所有敌人后,一旦你击中第一个敌人,它就会立即崩溃。@cellcortex我不太确定如何编辑我的上一条评论。我尝试过这样做,但没有奏效。它仍然会立即崩溃。我怀疑你的问题是因为你使用了删除了这条。而是删除这一行,让t的所有者来处理他用子弹做了删除。@RobbieE原来子弹并没有导致崩溃。调试器会在敌人的毁灭者面前崩溃