如何解决QListWidget清除方法
我的 QListWidget 中有 item 和 itemWidget。我想删除所有项目和所有项目小部件。我试着像这样删除它们:
lstWdgs->clear();
但我不确定它是否正确删除了 items 和 itemWidgets
解决方法
文档说“所有项目都将被永久删除。”。
额外提示:为什么不调试到 item
和 itemWidget
的 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的源代码
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。