【发布时间】:2014-06-09 19:05:24
【问题描述】:
我的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();的方法,而不是逐行删除,但结果相同。
我不明白为什么这段代码不起作用。
如果有人能对此事有所了解,我将不胜感激。
【问题讨论】:
-
它到底在哪里(以及带有什么消息)崩溃了?此外,您应该避免在 C++ 中使用 C 风格的输出 (
printf) ;) -
没有消息,它只是在添加新列表的 for 循环中的第一个
appendRow()处崩溃。实际上,我通过在此行之前和之后放置一个printf并意识到只有第一个被打印到控制台发现了这一点 -
您的项目层次结构如何?您删除子项目,但只添加顶级项目。
-
值得注意的是,使用
clear();与您手动执行的操作完全相同(好吧,它还将rowcount和colcount设置为0,而您没有这样做),所以使用它不是导致问题的原因。你能展示一下你是如何第一次填写模型的吗? -
是的,这是真的。那是因为参数中的列表是
QStandardItem。在构建这个新列表时,我将子项目附加到顶级项目,因此,当我将它们添加到模型时,我只需要添加顶级项目并且子项目会自动添加(我知道这是有效的,因为我添加的第一个列表以这种方式构造并且工作正常,只有在我删除第一个列表并尝试添加第二个列表后我才有问题)
标签: c++ qt qstandarditemmodel