У меня была та же проблема: у меня есть игровое приложение, класс главного окна которого наследует QMainWindow.Его конструктор выглядит примерно так:
m_scene = new QGraphicsScene;
m_scene->setBackgroundBrush( Qt::black );
...
m_view = new QGraphicsView( m_scene );
...
setCentralWidget( m_view );
Когда я хочу отобразить уровень игры, я создаю экземпляр QGridLayout, в который я добавляю QLabels, а затем устанавливаю их растровые изображения для определенных изображений (растровые изображения с прозрачнымчасти).Первый уровень отображается нормально, но при переключении на второй уровень растровые изображения с первого уровня все еще можно было увидеть за новыми (где растровое изображение было прозрачным).
Я попытался несколько вещей, чтобы удалить старыйвиджеты.(а) Я попытался удалить QGridLayout и создать новый экземпляр, но потом узнал, что удаление макета не приводит к удалению виджетов, добавленных в него.(b) Я попытался вызвать QLabel :: clear () для новых растровых изображений, но это, конечно, оказало влияние только на новые, а не на зомби.(c) Я даже пытался удалить свои m_view и m_scene и восстанавливать их каждый раз, когда отображал новый уровень, но все равно не получалось.
Затем (d) я попробовал одно из приведенных выше решений, а именно
QLayoutItem *wItem;
while (wItem = widget->layout()->takeAt(0) != 0)
delete wItem;
но это тоже не сработало.
Однако, погуглив дальше, Я нашел ответ, который сработал .Чего не хватало в (d), так это звонка на delete item->widget()
.Теперь у меня работает следующее:
// THIS IS THE SOLUTION!
// Delete all existing widgets, if any.
if ( m_view->layout() != NULL )
{
QLayoutItem* item;
while ( ( item = m_view->layout()->takeAt( 0 ) ) != NULL )
{
delete item->widget();
delete item;
}
delete m_view->layout();
}
, а затем я создаю новый QGridLayout, как с первым уровнем, добавляю к нему виджеты нового уровня и т. Д.
Qt хорош во многихпути, но я думаю, что эта проблема показывает, что здесь все может быть немного проще.