Reputation: 97
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
Upvotes: 1
Views: 2188
Reputation: 1735
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()
, sourceUpvotes: 3
Reputation: 1349
The docs say "All items will be permanently deleted.".
Extra hint: Why not debug into your dtor of item
and itemWidget
to see what happens?
Upvotes: 1