layout->removeWidget(x) funktioniert nicht

Alles rund um die Programmierung mit Qt
Antworten
ChornHulio
Beiträge: 62
Registriert: 7. November 2008 11:02

layout->removeWidget(x) funktioniert nicht

Beitrag 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
v01d
Beiträge: 7
Registriert: 3. November 2009 14:03
Wohnort: Hamburg

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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().
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Oder wenn du nach dem remove gleich ein repaint ausführst?
v01d
Beiträge: 7
Registriert: 3. November 2009 14:03
Wohnort: Hamburg

Beitrag 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).
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Die Doku sagt doch nur dass das Layout das Widget löscht sobald es selbst zerstört wird. Sonst nichts.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
v01d
Beiträge: 7
Registriert: 3. November 2009 14:03
Wohnort: Hamburg

Beitrag 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.
Antworten