I have item and itemWidget in my QListWidget. I want to delete all items and all items widgets. I try delete them like that:
lstWdgs->clear();
But i am not sure, that it deletes items and itemWidgets correctly
I have item and itemWidget in my QListWidget. I want to delete all items and all items widgets. I try delete them like that:
lstWdgs->clear();
But i am not sure, that it deletes items and itemWidgets correctly
On
The items and item widgets are destroyed when clear() is called. It can be tested by using the destroyed() signal for item widgets, and overriding the destructor of QListWidgetItem for items.
Example code:
#include "mainwindow.h"
#include <QListWidget>
#include <QListWidgetItem>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>
class ListWidgetItem : public QListWidgetItem
{
public:
explicit ListWidgetItem(const QString &text) : QListWidgetItem(text) {}
~ListWidgetItem()
{
qDebug() << this->text() << "destroyed";
}
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QListWidget *list_widget = new QListWidget;
ListWidgetItem *list_widget_item = new ListWidgetItem{tr("Item 1")};
QPushButton *button = new QPushButton{tr("Button")};
connect(button, &QObject::destroyed, this, []()
{
qDebug() << "Button destroyed";
});
connect(list_widget->viewport(), &QObject::destroyed, this, []()
{
qDebug() << "Viewport destroyed";
});
list_widget->addItem(list_widget_item);
list_widget->addItem(new ListWidgetItem{tr("Item 2")});
list_widget->addItem(new ListWidgetItem{tr("Item 3")});
list_widget->setItemWidget(list_widget->item(2), button);
QPushButton *clear_button = new QPushButton{tr("Clear list")};
connect(clear_button, &QPushButton::clicked, this, [list_widget]()
{
qDebug() << "Clearing list";
list_widget->clear();
});
QPushButton *delete_button = new QPushButton{tr("Delete list")};
connect(delete_button, &QPushButton::clicked, this, [=]()
{
qDebug() << "Deleting list";
delete list_widget;
delete_button->setDisabled(true);
clear_button->setDisabled(true);
});
QWidget *central_widget = new QWidget{this};
this->setCentralWidget(central_widget);
QVBoxLayout *layout = new QVBoxLayout{central_widget};
layout->addWidget(list_widget);
layout->addWidget(clear_button);
layout->addWidget(delete_button);
}
MainWindow::~MainWindow()
{
}
The output after clicking the clear button is:
Clearing list
"Item 1" destroyed
"Item 2" destroyed
"Item 3" destroyed
Button destroyed
As to how this happens, we can look into Qt's source code
clear() deletes the items, and calls endResetModel(), sourceendResetModel() emits modelReset(), sourcemodelReset() connected to view's reset(), sourcereset() releases the editors (widgets) in indexEditorHash, deleting the widgets, sourceindexEditorHash stores the widget in setIndexWidget() by calling addEditor(), sourcesetIndexWidget() called by setItemWidget(), source
The docs say "All items will be permanently deleted.". Extra hint: Why not debug into your dtor of
itemanditemWidgetto see what happens?