C++ QT-QTableView removeRow()崩溃
此函数应该从附加到QTable视图的QStandardItemModel中删除一行C++ QT-QTableView removeRow()崩溃,c++,qt,qtableview,qstandarditemmodel,C++,Qt,Qtableview,Qstandarditemmodel,此函数应该从附加到QTable视图的QStandardItemModel中删除一行 void ModManager::delete_Addin(int index) { QString addinId; int i; addinId = tableModel->item(index,0)->text(); for(i=0;i<modList->size();i++) { if(modList->at(i)-
void ModManager::delete_Addin(int index)
{
QString addinId;
int i;
addinId = tableModel->item(index,0)->text();
for(i=0;i<modList->size();i++)
{
if(modList->at(i)->Id() == addinId)
{
delete modList->takeAt(i);
break;
}
}
tableModel->removeRow(index);
}
void ModManager::delete_Addin(int索引)
{
QString-addinId;
int i;
addinId=tableModel->item(索引,0)->text();
对于(i=0;isize();i++)
{
如果(modList->at(i)->Id()==addinId)
{
删除modList->takeAt(i);
打破
}
}
tableModel->removeRow(索引);
}
奇怪的是,程序在最后一条指令时崩溃,tableModel->removeRow(index)代码>
而且它没有超出范围,因为tableModel->item(index,0)
是有效的。
那么可能是什么呢?代码在modList
和tableModel
之间没有相关性tableModel->item(index,0)
在更改modList
之前是有效的,而tableModel->rowAt(index)
在修改之后是无效的。有几种可能性:
正如@vahancho所暗示的,修改modList
会影响tableModel
。这可以通过注释for循环或更改行的顺序来验证。这可以通过使用modList
作为tableModel
的真实数据来实现,例如,您是否通过将modList->at(i)
返回为QTableModel::data
并将modList->count()
返回为QTableModel::rowCount()
来实现自定义QTableModel
modList
不影响tableModel
,但该项已在其他地方引用。这不能从代码中分辨出来 我会尝试调用deletemodlist->takeAt(I)代码>在我调用tableModel->removeRow(索引)之后代码>。如果它被压碎,则超出范围。检查调试控制台的说明。Doif(index>-1&&indexrowCount()){tableModel->removeRow(index);}
ok ModList是一个QList,带有指向Addin
的指针,这是我创建的一个自定义对象,无法修改表中的任何内容。我不知道它会如何影响这个表,只是试着把deletemodlist->takeAt(I)代码>在循环开始之前。仍然崩溃。我仔细检查了通过的索引,它在范围内。可能是什么?我猜这个项目是在其他地方引用的。如果您确定项目索引在范围内且有效,则删除其他人引用的内容可能会导致崩溃。为什么不在崩溃时发布回调堆栈,以便人们可以帮助您。好的,我如何找到回调堆栈以在此处发布?