QListWidget清除方法

时间:2021-07-29 08:22:34

标签: c++ qt qlistwidget qlistwidgetitem

我的 QListWidget 中有 item 和 itemWidget。我想删除所有项目和所有项目小部件。我试着像这样删除它们:

lstWdgs->clear();

但我不确定它是否正确删除了 items 和 itemWidgets

2 个答案:

答案 0 :(得分:1)

文档说“所有项目都将被永久删除。”。 额外提示:为什么不调试到 itemitemWidget 的 dtor 中看看会发生什么?

答案 1 :(得分:1)

当调用 clear() 时,items 和 item 小部件被销毁。可以通过对项目小部件使用 destroyed() 信号并覆盖项目的 QListWidgetItem 析构函数来测试它。

示例代码:

#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()
{
}

点击清除按钮后的输出为:

<块引用>

清点清单
“物品 1”被摧毁
“物品 2”被摧毁
“物品 3”被摧毁
按钮被破坏

至于这是怎么发生的,我们可以查看Qt的源代码

  1. clear() 删除项目,并调用 endResetModel()source
  2. endResetModel() 发出 modelReset(), source
  3. modelReset() 已连接到视图的 reset()source
  4. View 的 reset() 释放 indexEditorHash 中的编辑器(小部件),删除小部件,source
  5. indexEditorHash 通过调用 setIndexWidget()source
  6. 将小部件存储在 addEditor()
  7. setIndexWidget()setItemWidget() 调用,source
相关问题