J'ai eu le même problème: j'ai un jeu app dont la principale fenêtre de la classe hérite de QMainWindow. Son constructeur semble en partie comme ceci:
m_scene = new QGraphicsScene;
m_scene->setBackgroundBrush( Qt::black );
...
m_view = new QGraphicsView( m_scene );
...
setCentralWidget( m_view );
Lorsque je veux afficher un niveau de jeu, j'instancie un QGridLayout, dans laquelle j'ai ajouté QLabels, et définissez leurs images de certaines images (images avec des parties transparentes). Le premier niveau s'affiche bien, mais lors du passage au deuxième niveau, les images à partir du premier niveau pourrait encore être vu derrière nouvelles (où le pixmap a été transparent).
J'ai essayé plusieurs choses pour supprimer l'ancienne widgets. (a) j'ai essayé de supprimer le QGridLayout et l'instanciation d'une nouvelle, mais alors appris que la suppression d'une disposition ne permet pas de supprimer les widgets ajoutés. (b) j'ai essayé d'appeler QLabel::clear() sur les nouvelles images, mais qui bien sûr n'ont qu'un effet sur les nouveaux, pas le zombie ceux. (c) j'ai même essayé de la suppression de mon m_view et m_scene, et de les reconstruire à chaque fois que j'affiche un nouveau niveau, mais toujours pas de chance.
Puis (d) j'ai essayé l'une des solutions proposées ci-dessus, à savoir
QLayoutItem *wItem;
while (wItem = widget->layout()->takeAt(0) != 0)
delete wItem;
mais cela ne fonctionne pas, soit.
Toutefois, google plus, j'ai trouvé une réponse qui a travaillé. Ce qui manquait à partir de (d) est un appel à l' delete item->widget()
. La suite maintenant fonctionne pour moi:
// 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();
}
et puis j'instancie un nouveau QGridLayout comme avec le premier niveau, ajouter un nouveau niveau de widgets, etc.
Qt est grande dans beaucoup de façons, mais je ne pense que c'problèmes montre que les choses pourraient être un peu plus facile ici.