Seite 1 von 1

layout->removeWidget(x) funktioniert nicht

Verfasst: 1. September 2009 21:08
von ChornHulio
Hallo zusammen,

ich will einem Layout ein Widget entziehen mit

Code: Alles auswählen

layout->removeWidget(zeigerAufDasWidget);
Aber das funktioniert nicht - es lässt sich problemlos ausführen, macht aber gar nichts! Was mache ich falsch?

Danke für eure Antworten

Verfasst: 22. Februar 2010 15:46
von v01d
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.

Verfasst: 22. Februar 2010 15:49
von franzf
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().

Verfasst: 22. Februar 2010 15:56
von Mani99
Oder wenn du nach dem remove gleich ein repaint ausführst?

Verfasst: 22. Februar 2010 16:15
von v01d
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).

Verfasst: 22. Februar 2010 16:25
von Christian81
Die Doku sagt doch nur dass das Layout das Widget löscht sobald es selbst zerstört wird. Sonst nichts.

Verfasst: 24. März 2010 13:45
von v01d
Aus der 4.6 API:

Code: Alles auswählen

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.

Code: Alles auswählen

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.