Simpsons
Simpsons

Reputation: 526

How do I delete all items from a QStandardItemModel

I am having some trouble with my QStandardItemModel. What I want to do is add a list to my model, and when the list is updated, I pass the new list in the parameter, clear the old model and add the new list. This sounds simple enough but i'm coming across a bug that i can't figure out. When i add the first list to the model there is no problem, but when i add the second one, the first one is successfully deleted (I can see that in the console) but then the application crashes.

Here is my code :

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");
}

Obviously i have tried using the method clear(); instead of deleting row by row but it has the same result.

I don't understand why this code doesn't work.

If somebody can shed some light on the matter i would be very grateful.

Upvotes: 6

Views: 10418

Answers (2)

Garjy
Garjy

Reputation: 497

The following code is in PyQt, however it's very similar to what you need:

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

Upvotes: 8

Simpsons
Simpsons

Reputation: 526

The problem was coming from the fact that i was adding the items from the input list directly to the new list. As the input list was created in a different class the parent of the items in it was different and when trying to delete them from the new list it made the application crash.

I resolved the issue by creating the new list from new items and just taking the text() of the old list :

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);
        }
    }
}

This meant that i had to run through the list of children in the input list as pointed out in one of the previous comments because by creating new items i needed to re-append them.

Thanks for all the help

Upvotes: 0

Related Questions