在QAbstractTableModel中删除最后一项时“索引超出范围”

时间:2013-04-08 11:50:10

标签: qt

我根据文档实现了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()方法显然是罪魁祸首。

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

刚遇到同样的问题。只需调用reset()并在之后删除行。

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