0

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

lstWdgs->clear();

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

4

2 回答 2

1

项目和项目小部件在clear()被调用时被销毁。它可以通过使用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()删除项目,并调用
  2. endResetModel()发射modelReset()
  3. modelReset()连接到视图reset()
  4. Viewreset()发布了 中的编辑器(小部件)indexEditorHash,删除了小部件,
  5. indexEditorHashsetIndexWidget()通过调用addEditor(), source存储小部件
  6. setIndexWidget()调用者setItemWidget()来源
于 2021-07-30T07:28:50.510 回答
1

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

于 2021-07-30T06:49:57.660 回答