1

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

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

4

3 回答 3

3

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

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

于 2013-04-08T12:08:42.793 回答
1

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

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

于 2013-04-08T12:07:01.310 回答
1

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

void QItemSelectionModel::reset() [virtual slot]
Clears the selection model. Does not emit any signals.
于 2014-08-25T14:14:29.153 回答