Entfernen von QWidgets von einem QGridLayout
Ich habe eine QGridLayout
wo ich mein custom QWidgets
.
Wenn ich versuche zu löschen Sie alle von Ihnen, die Sie angeblich sind, entfernt aus dem layout (wie die Funktion layout.count()
gibt 0 zurück), aber Sie sind immer noch im interface und ich kann mit Ihnen interagieren.
Hier haben Sie die Möglichkeit, die ich widgets hinzufügen:
void MyClass::addCustomWidget(CustomWidget *_widget, int r, int c)
{
layout->addWidget(_widget, r, c);
_widget->show();
}
Und hier die Art, wie ich diese löschen:
void MyClass::clearLayout()
{
qDebug() << "Layout count before clearing it: " << layout->count();
int count = layout->count();
int colums = layout->columnCount();
int rows = layout->rowCount();
int i=0;
for(int j=0; j<rows; j++)
{
for(int k=0; k<colums && i<count; k++)
{
i++;
qDebug() << "Removing item at: " << j << "," << k;
QLayoutItem* item = layout->itemAtPosition(j, k);
if (!item) continue;
if (item->widget()) {
layout->removeWidget(item->widget());
} else {
layout->removeItem(item);
}
qDebug() << "Removed!";
}
}
qDebug() << "Layout count after clearing it: " << layout->count();
}
Jede Art von Hilfe oder Tipp zum löschen von Elementen/widgets ordnungsgemäß von einem QGridLayout?
P. D. : ich habe im internet gesehen, dass eine Menge Leute löscht das widget direkt (löschen _widget) nach dem entfernen Sie Sie aus dem layout. In meinem Fall ist es nicht möglich, da muss ich mantain, dass die widgets im Speicher.
InformationsquelleAutor AZorrozua | 2012-05-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur klar zu sein. Sie hat nicht "löschen" wird die widgets. Sie nur entfernt, die Ihnen vom layout. Entfernen von layout bedeutet nur, dass widget wird nicht mehr verwaltet (geändert/positioniert), die von diesem layout, ABER das bedeutet nicht, das widget wird "deleted" (in C++). Auch die widgets werden nicht magisch verborgen. Ihr widget nach dem entfernen aus dem layout noch Blätter im widget wurde erstellt /verwaltet. Also Besitzer dieses layout hat noch dieses widget als Kind (Kind sichtbar).
Müssen Sie
ausblenden widget oder wenn Sie sicher sind, dass es nicht mehr verwendet werden
widget löschen mit "löschen" keyword
Außerdem brauchen Sie nicht zu rufen
removeWidget(item->widget())
;removeItem(item)
wird genug für alle layout-Elemente (auch mit widget-innen)InformationsquelleAutor Kamil Klimek
Versuchen
Ist es soll sicher sein. Wenn man aus irgendwelchen Gründen nicht funktioniert, können Sie eine Sammlung von widgets oder layoutitems, die jedes mal aktualisiert, wenn Sie ein widget hinzufügen. Dann löschen Sie die Schleife auf der Sammlung und entfernen Sie jedes element aus dem layout.
InformationsquelleAutor UmNyobe
InformationsquelleAutor user2956496
Können Sie auch
deleteLater()
zu vermeiden Problem mit der Aufrechterhaltung KindZählung während der Iterationen:
InformationsquelleAutor vdudouyt