Как удалить все элементы из QStandardItemModel

У меня проблемы с моим 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(); вместо удаления строки за строкой, но это имеет тот же результат.

Я не понимаю, почему этот код не работает.

Если кто-то может пролить свет на этот вопрос, я был бы очень благодарен.

1

Решение

Следующий код в PyQt, однако он очень похож на то, что вам нужно:

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

Другие решения

Проблема возникла из-за того, что я добавлял элементы из списка ввода непосредственно в новый список. Поскольку входной список был создан в другом классе, родительские элементы в нем отличались, и при попытке удалить их из нового списка это приводило к падению приложения.

Я решил проблему, создав новый список из новых элементов и просто 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);
}
}
}

Это означало, что мне пришлось пробежаться по списку детей в списке ввода, как указано в одном из предыдущих комментариев, потому что, создавая новые элементы, мне нужно было повторно добавлять их.

Спасибо за помощь

0

По вопросам рекламы [email protected]