我的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();
而不是逐行删除,但结果相同。
我不明白为什么这段代码不起作用。
如果有人能对此事有所了解,我将非常感激。
答案 0 :(得分:2)
以下代码在PyQt中,但它与您的需求非常相似:
model.removeRows( 0, model.rowCount() )
答案 1 :(得分:0)
问题来自于我将输入列表中的项目直接添加到新列表中。由于输入列表是在不同的类中创建的,因此其中项目的父项是不同的,当尝试从新列表中删除它们时,它使应用程序崩溃。
我通过从新项目创建新列表并仅使用旧列表的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);
}
}
}
这意味着我必须按照之前的一条评论中的指示运行输入列表中的子项列表,因为通过创建新项目我需要重新附加它们。
感谢所有帮助