Ich habe das gleiche Problem, kann aber noch ein paar zusätzliche Details geben:
"layout->removeWidget(zeigerAufDasWidget)" entfernt zwar das Widget korrekt aus dem Layout ("QLayout::count()" verringert sich), das entfernte Widget wird aber trotzdem weiterhin gezeichnet (warum?). Auch ein "QLayout::invalidate()" oder ein "QWidget::updateGeometry()" hat da keine Wirkung.
Meine aktuelle Lösung verwendet anstelle des Remove-Aufrufs einfach ein "delete zeigerAufDasWidget". Das wiederum beißt sich allerdings theoretisch mit der Doku von "QLayout::addWidget()" bzw. "QLayout::addItem()" wo es heißt:
Note: The ownership of item is transferred to the layout, and it's the layout's responsibility to delete it.
Klar, das removeWidget() nimmt es wohl nur aus dem Layout, ansonsten wird nix geändert. selbe geometry, und vor allem immer noch visible()!
Wenn du das Widget später wieder brauchst, mach nach dem remove ein hide().
Nein, "Repaint" hat auch keine Wirkung. Wirklich funktionieren tut nur die Destruktion des Widgets, oder wie franzf schrieb ein "hide()"-Aufruf.
Das liegt wohl daran, dass Positionionierung und Skalierung Aufgabe des Parent-Layouts sind, das Zeichnen aber Aufgabe des Parent-Widgets (welches auch nach QLayout::removeWidget() noch Vater bleibt). Insofern wundert mich nur diese Note aus der Doku (siehe letzer Post von mir).
void QLayout::addItem ( QLayoutItem * item ) [pure virtual]
Note: The ownership of item is transferred to the layout, and it's the layout's responsibility to delete it.
void QLayout::removeItem ( QLayoutItem * item )
Removes the layout item item from the layout. It is the caller's responsibility to delete the item.
Wenn man nun nur die eine Doku liest oder nicht gleich kapiert, dass mit den beiden Aussagen jeweils post conditions gemeint sind, kann man das schon als Widerspruch missverstehen.