当重载Qt中QAbstractItemModel实现自定义模型时,有时会重载insertRow()、removeRow()等函数。但调用removeRow()后,有时会因为QModelIndex.internalPointer()访问异常(也就是野指针)而崩溃。其实是因为QModelIndex在删除行后依然残留的问题,但是这个QModelIndex.internalPointer()早已析构。换成QPersistentModelIndex也是如此。
其实,我们仔细查看Qt官方文档中对QAbstractItemModel的说明就可以知道问题:
这里说到:
当在子类中重载removeRows()时,你必须在从model的实际数据存储中删除数据前,调用该函数。
同时,这个函数还有一个对应的函数:
需要在removeRow()的结尾调用。否则结果可能不符合预期。
其实内部也应该是弃用了删除行的QModelIndex,让其不再使用。
参考:
Qt 报错:~QPersistentModelIndex: “persistent model indexes corrupted”
删除行时QModelIndex变为无效