igorotvertka
igorotvertka

Reputation: 97

QListWidget clear method

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

Answers (2)

Minh
Minh

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

  1. clear() deletes the items, and calls endResetModel(), source
  2. endResetModel() emits modelReset(), source
  3. modelReset() connected to view's reset(), source
  4. View's reset() releases the editors (widgets) in indexEditorHash, deleting the widgets, source
  5. indexEditorHash stores the widget in setIndexWidget() by calling addEditor(), source
  6. setIndexWidget() called by setItemWidget(), source

Upvotes: 3

falkb
falkb

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

Related Questions