QListWidget清除方法

问题描述

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

lstWdgs->clear();

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

解决方法

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

,

当调用 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(),[]()
    {
        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,[list_widget]()
    {
        qDebug() << "Clearing list";
        list_widget->clear();
    });
    QPushButton *delete_button = new QPushButton{tr("Delete list")};
    connect(delete_button,[=]()
    {
        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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...