我根据文档实现了removeRows()
方法。我的数据存储在QList中。我可以使用以下方法删除项目:
bool MeasurementManager::removeRows(int row, int count, const QModelIndex &m) {
if(count > 1) {
qDebug() << "MeasurementManager: cannot remove more than one measurement";
return false;
}
beginRemoveRows(QModelIndex(), row, row+count-1);
list.removeAt(row);
endRemoveRows();
return true
}
但是,在删除最后一项时,我会在执行beginRemoveRows()
时收到以下错误消息:
ASSERT failure in QList<T>::at: "index out of range"
当删除最后一项(导致崩溃)时,它显然必须在第0行,但只要模型中有其他项目,我就可以删除第0行中的项目而没有任何问题。
如果我注释掉实际删除我的数据
beginRemoveRows(QModelIndex(), row, row+count-1);
//list.removeAt(row);
endRemoveRows();
没有崩溃发生,所以我的假设是,某些东西试图在删除后访问列表的一个元素。然而,当单步执行该功能时,beginRemoveRows()
方法显然是罪魁祸首。
任何帮助从哪里开始调试都将不胜感激!
答案 0 :(得分:3)
我找到了解决方案,我很糟糕。我已将'selectChanged()'信号连接到自定义插槽。这试图访问表模型中最近删除的项目。
我忽略了,取消选择一个表项也会发出selectionChanged()
信号。
答案 1 :(得分:1)
你看到的可能是通过优化代码引入的代码重新排序的工件。
在禁用所有优化的情况下再次编译代码,以避免混淆调试器。
答案 2 :(得分:1)
刚遇到同样的问题。只需调用reset()并在之后删除行。
void QItemSelectionModel::reset() [virtual slot]
Clears the selection model. Does not emit any signals.