Странное поведение объекта на QGraphicsScene
От: XOOIOOX  
Дата: 08.05.20 18:39
Оценка:
Есть объект на сцене, который сам себя добавляет на нее и сам себя удаляет:

Monster::Monster(CentralDataStruct& data) : QObject(nullptr), QGraphicsRectItem(nullptr), centralData(data)
{
    setRect(0, 0, TileSize, TileSize);
    centralData.scene->addItem(this);
    destroyTimer = new QTimer(this);
    connect(destroyTimer, SIGNAL(timeout()), this, SLOT(destroySlot()));
}

Monster::~Monster()
{
    scene()->removeItem(this);
}

void Monster::advance(int phase)
{
    if (!phase)
    {
        emit destroySignal();
        //destroyTimer->start(1);
    }
}

void Monster::destroySlot()
{
    emit destroySignal();
}

Хранится в std::list, но это не принципиально.

Странность заключается в том, что если он из метода advance посылает сигнал вовне (там очищаем список, скажем), то приключается крэш — сцена обращается по невалидному указателю. Если же посылать сигнал через таймер, даже с минимальной задержкой (закомменченная строка), все обрабатывается нормально, крэша нет. В обоих случаях снаружи видно, что объект удаляется со сцены.
Извне, опять же, объект удаляется корректно.

Как так получается? В чем засада?

https://www.youtube.com/watch?v=-Ui4prpCZ0w
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.