我的 QListWidget 中有 item 和 itemWidget。我想删除所有项目和所有项目小部件。我尝试像这样删除它们:
lstWdgs->clear();
但我不确定它是否正确删除了项目和 itemWidgets
我的 QListWidget 中有 item 和 itemWidget。我想删除所有项目和所有项目小部件。我尝试像这样删除它们:
lstWdgs->clear();
但我不确定它是否正确删除了项目和 itemWidgets
项目和项目小部件在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的源码
文档说“所有项目都将被永久删除。”。额外提示:为什么不调试到你的 dtor 中item
看看itemWidget
会发生什么?