如何从QStandardItemModel中删除所有项目

How do I delete all items from a QStandardItemModel

本文关键字:项目 删除 QStandardItemModel      更新时间:2023-10-16

我的QStandardItemModel出现了一些问题。我想做的是向我的模型添加一个列表,当列表更新时,我在参数中传递新列表,清除旧模型并添加新列表。这听起来很简单,但我遇到了一个我无法理解的错误。当我将第一个列表添加到模型中时,没有问题,但当我添加第二个列表时,第一个列表被成功删除(我可以在控制台中看到),但随后应用程序崩溃。

这是我的代码:

void MyModel::updateList(QList<QStandardItem*> list)
{
    // Delete current model
    int rows = rowCount();
    for (int i = 0 ; i < rows ; i++)
    {
        if(item(0)->hasChildren())
        {
            int children = item(0)->rowCount();
            for (int j = 0 ; j < children ; j++)
            {
                QString name = item(0)->child(0)->accessibleText();
                qDebug()<<(name + QLatin1String("tremoved"));
                item(0)->removeRow(0);
            }
        }
        QString itemRemoved = item(0)->accessibleText();
        qDebug()<<(itemRemoved + QLatin1String("tremoved"));
        removeRow(0);
    }

    // Add new list to model
    for(int j=0 ; j<list.count() ; j++)
    {
        appendRow(list[j]);
        qDebug()<< (list[j]->accessibleText() + tr(" ADDED"));
    }
    printf("List UPDATED n");
}

显然,我尝试过使用方法clear();,而不是逐行删除,但结果相同。

我不明白为什么这个代码不起作用。

如果有人能澄清这件事,我将不胜感激。

以下代码在PyQt中,但它与您需要的非常相似:

model.removeRows( 0, model.rowCount() )

问题来自于我将输入列表中的项目直接添加到新列表中。由于输入列表是在不同的类中创建的,其中项目的父级是不同的,当试图从新列表中删除它们时,应用程序崩溃。

我通过从新项目创建新列表并只使用旧列表的text()来解决问题:

void MyModel::updateList(QList<QStandardItem*> list)
{
    clear();
    for(int i=0 ; i<list.count() ; i++)
    {
        QStandardItem *l_item = new QStandardItem(list[i]->text());
        l_item->setEditable(false);
        l_item->setCheckable(true);
        appendRow(l_item);
        for (int j = 0 ; j<list[i]->rowCount() ; j++)
        {
            QStandardItem *l_subItem = new QStandardItem(list[i]->child(j)->text());
            l_subItem->setEditable(false);
            l_subItem->setCheckable(true);
            l_item->appendRow(l_subItem);
        }
    }
}

这意味着我必须遍历输入列表中的子项列表,正如前面的一条评论中所指出的,因为通过创建新项,我需要重新添加它们。

感谢所有的帮助