在此程序中,项目(markers
)被添加到QListWidget calles ui->lwMarkers
。也可以通过按“删除按钮”再次删除这些项目,该按钮调用以下功能
void Form::on_pbRemoveMarker_clicked()
{
if (ui->lwMarkers->currentRow() < 0) return;
delete ui->lwMarkers->takeItem(ui->lwMarkers->currentRow());
}
在函数内部,第一行是确保实际选择了一个项目(标记)。 第二行是(至少,我希望)删除所选项目。
添加和删除:一切顺利,除非您想要删除倒数第二个项目。不幸的是,它崩溃了。我不明白为什么。
有人能解释这个问题吗?
如果有帮助:完整代码来自qt-google-maps项目:https://code.google.com/p/qt-google-maps/。该项目使用Google Maps API v2,我将代码更改为使用v3。
我问的问题是他们代码的特定行为,我根本看不到崩溃的原因。有什么帮助吗?
崩溃总是发生在delete
之前,我相信这是因为takeItem
而我得到的错误如下:
QList :: operator []中的ASSERT失败:“索引超出范围”,文件../../QtSDK/Desktop/Qt/473/gcc/include/QtCore/qlist.h,第464行
答案 0 :(得分:0)
可能是takeItem
是恶人吗?根据{{3}},它从QListWidget中删除该项并返回它。它还提到:
从列表小部件中删除的项目不会由Qt管理,需要手动删除。
这就是为什么,对我来说,原始代码似乎是正确的,您从列表小部件中删除该项并在之后删除它。但是,当尝试删除倒数第二个项目时,它会给出上述错误。
我建议改用item()
函数,并相应删除它:
void Form::on_pbRemoveMarker_clicked()
{
if (ui->lwMarkers->currentRow() < 0) return;
delete ui->lwMarkers->item(ui->lwMarkers->currentRow());
}
该程序的前端现在按预期工作,但是我是否以这种方式泄漏内存?
您可能会看到其他任何问题吗?