2013-04-08 104 views
0

我根据文档实现了removeRows()方法。我的数据存储在QList中。删除QAbstractTableModel中的最后一项时出现“索引超出范围”

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()方法显然是罪魁祸首。

任何帮助从哪里开始调试,将不胜感激!

回答

2

我找到了解决方案,我的不好。我已将'selectChanged()'信号连接到自定义插槽。这试图访问表模型中最近删除的项目。

我忽略了,取消选中一个表项也会发出一个selectionChanged()信号。

1

您看到的可能是通过优化代码引入的代码重新排序的工件。

再次编译代码,禁用所有优化以避免混淆调试器。

1

刚刚有同样的问题。只需调用reset(),然后删除行。

void QItemSelectionModel::reset() [virtual slot] 
Clears the selection model. Does not emit any signals.