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.
printf
) in C++ ;) – OpinionatedappendRow()
in the for loop that adds the new list. I actually found that out by placing oneprintf
before and one after this line and realising that only the first was printed to the console – Ridgelingclear();
does exactly the same thing that you are doing manually (well, it also sets therowcount
andcolcount
to 0, which you don't), so using it is not what causes the problem. Can you show how do you fill in the model for the first time? – OpinionatedQStandardItem
. Whilst constructing this new list, i append subitems to top level items, hence, when i add them to the model, i only need to add the top level items and the subitems are added automatically (i know this works because the first list I add is constructed this way and works fine, it is only after i delete the first list and try to add the second that i have a problem) – Ridgelingclear();
but it crashes in exactly the same place. This is how I fill the model the first time, i send a list in the parameter and it is added. – RidgelinginvisibleRootItem()
instead of the model itself? – Opinionated