QT - QTableView removeRow() 崩溃
Posted
技术标签:
【中文标题】QT - QTableView removeRow() 崩溃【英文标题】:QT - QTableView removeRow() crashing 【发布时间】:2014-03-25 20:47:06 【问题描述】:这个函数应该从我的 QStandardItemModel 中删除一行,附加到一个 QTable 视图。
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);
奇怪的是程序在最后一条指令处崩溃,tableModel->removeRow(index);
而且它不会超出范围,因为tableModel->item(index,0)
是有效的。
那会是什么?
【问题讨论】:
我会在拨打tableModel->removeRow(index);
之后尝试拨打delete modList->takeAt(i);
。
如果它被压碎,那么 它超出范围。检查调试控制台的内容。做if (index>-1 && index<tableModel->rowCount())tableModel->removeRow(index);
【参考方案1】:
代码不存在modList
和tableModel
之间的相关性。 tableModel->item(index,0)
在修改modList
前有效,tableModel->rowAt(index)
修改后失效。有几种可能:
修改modList
会影响tableModel
,正如@vahancho 所暗示的那样。这可以通过注释掉 for 循环或更改行的顺序来验证。这可以通过使用modList
作为tableModel
的真实数据来实现,例如,您是否通过将modList->at(i)
返回为QTableModel::Data
并将modList->count()
作为QTableModel::rowCount()
返回来实现自定义QTableModel?
modList
不影响tableModel
,但该项目在其他地方被引用。这不能从代码中看出。
【讨论】:
ok ModList 是一个 QList,带有指向Addin
的指针,这是我制作的一个自定义对象,它不能修改表中的任何内容。我不知道它会对桌子产生什么影响。
刚刚尝试在循环开始前输入delete modList->takeAt(i);
。仍然崩溃。
我仔细检查了传递的index
,它在范围内。会是什么?
猜测该项目在其他地方被引用。如果您确定项目索引在范围内并且有效,则可以通过删除其他人引用的内容来导致崩溃。为什么不在崩溃时发布回调堆栈,以便人们可以帮助您。
好的,我怎样才能找到要在此处发布的回调堆栈?以上是关于QT - QTableView removeRow() 崩溃的主要内容,如果未能解决你的问题,请参考以下文章