Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检测到冲突后删除用户定义的qGraphicItems_C++_Qt_Qgraphicsitem_Qgraphicsscene - Fatal编程技术网

C++ 检测到冲突后删除用户定义的qGraphicItems

C++ 检测到冲突后删除用户定义的qGraphicItems,c++,qt,qgraphicsitem,qgraphicsscene,C++,Qt,Qgraphicsitem,Qgraphicsscene,我有一个子弹类,我想在击中任何东西时删除它,但如果它击中敌人,我想它也删除敌人。它在我的桌面上工作,但在切换到我的笔记本电脑时,每当它被移除时,它就开始崩溃。当前,我的场景位于Dialog.cpp中的另一个类中 这是我的密码: bullet.cpp void bullet::DoCollision() { QList<QGraphicsItem *> list = collidingItems() ; foreach(QGraphicsItem * i , list

我有一个子弹类,我想在击中任何东西时删除它,但如果它击中敌人,我想它也删除敌人。它在我的桌面上工作,但在切换到我的笔记本电脑时,每当它被移除时,它就开始崩溃。当前,我的场景位于Dialog.cpp中的另一个类中

这是我的密码:

bullet.cpp

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原来子弹并没有导致崩溃。调试器会在敌人的毁灭者面前崩溃