首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QListWidget clear方法

QListWidget clear方法
EN

Stack Overflow用户
提问于 2021-07-29 16:22:34
回答 2查看 65关注 0票数 0

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

代码语言:javascript
复制
lstWdgs->clear();

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

EN

回答 2

Stack Overflow用户

发布于 2021-07-30 06:49:58

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

票数 1
EN

Stack Overflow用户

发布于 2021-07-30 07:28:51

调用clear()时,items和item小部件将被销毁。可以通过使用item小部件的destroyed()信号并覆盖items的QListWidgetItem析构函数来测试它。

示例代码:

代码语言:javascript
复制
#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的源代码

  1. clear()删除项目,并调用source
  2. modelReset()source
  3. View's发出modelReset()source
  4. setIndexWidget()连接到视图的source

source

  • endResetModel() reset()indexEditorHash中释放编辑器( widget ),删除widget,source

  • indexEditorHash通过调用addEditor()setItemWidget()调用widget,将widget存储在setIndexWidget()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68572510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档