我的QListWidget中有item和itemWidget。我想删除所有项目和所有项目小工具。我试着这样删除它们:
lstWdgs->clear();但我不确定它是否能正确删除项目和itemWidgets
发布于 2021-07-30 06:49:58
文档上写着“所有项目都将被永久删除”。额外提示:为什么不调试到item和itemWidget的dtor中,看看会发生什么?
发布于 2021-07-30 07:28:51
调用clear()时,items和item小部件将被销毁。可以通过使用item小部件的destroyed()信号并覆盖items的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()
{
}单击clear按钮后的输出为:
清除列表
"Item 1“已销毁
"Item 2“已销毁
"Item 3“已销毁
按钮已销毁
至于这是如何发生的,我们可以查看Qt的源代码
endResetModel() reset()在indexEditorHash中释放编辑器( widget ),删除widget,source
indexEditorHash通过调用addEditor(),setItemWidget()调用widget,将widget存储在setIndexWidget()中https://stackoverflow.com/questions/68572510
复制相似问题