AZorrozua AZorrozua - 9 months ago 37
C++ Question

Removing QWidgets from a QGridLayout

I have a

QGridLayout
where I add my custom
QWidgets
.

When I try to delete all of them they are supposedly removed from the layout (as the function
layout.count()
returns 0) but they are still shown in the interface and I can interact with them.

Here you have the way I add widgets:

void MyClass::addCustomWidget(CustomWidget *_widget, int r, int c)
{
layout->addWidget(_widget, r, c);
_widget->show();
}


And here the way I delete them:

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();
}


Any kind of help or tip to delete items/widgets correctly from a QGridLayout?

P.D. : I have seen on the internet that a lot of people deletes the widget directly (delete _widget) after removing them from the layout. In my case it is not possible as I need to mantain that widgets in memory.

Answer Source

Just to be clear. You didn't "delete" the widgets. You only removed them from layout. Removing from layout means only that widget will be no more managed (resized/positioned) by this layout BUT it doesn't mean that widget will be "deleted" (in C++ way). Also widget won't be magically hidden. Your widget after removing from layout still leaves in widget it was created / managed in. So owner of this layout still has this widget as child (visible child).

You have to

1) hide widget

or if you're sure it will not be used anymore

2) delete widget with "delete" keyword

Also you don't need to call removeWidget(item->widget()); removeItem(item) will be enough for all layout items (even those with widget inside)