【发布时间】:2014-07-22 19:21:57
【问题描述】:
在这个程序中,项目 (markers) 被添加到调用 ui->lwMarkers 的 QListWidget 中。这些项目也可以通过按下调用以下函数的“删除按钮”再次删除
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 行
【问题讨论】:
-
您能确认
ui->lwMarkers->currentRow()没有从1 回到N,其中N 是行数吗?如果是这种情况,您必须从 currentRow() 中减去一个以用于拍摄项目。 -
( 我之前的评论写错了,删除了,这里是正确的信息: ) qt-project.org/doc/qt-4.8/qlistwidget.html#currentRow-prop : 实际上,
currentRow()返回 0 到 N- 1 当一行被激活/选中时。当没有行处于活动/选择状态时,它返回-1(因此if-test)