从listWidget中删除所选项

31
如何从中删除所选项目? 我尝试编写以下代码,但它不起作用。
QList<QListWidgetItem*> items = ui->listWidget->selectedItems();
foreach(QListWidgetItem item, items){
    ui->listWidget->removeItemWidget(item);
}

为什么item不是指针? - wuqiang
@wuqiang:我已经将item更改为*item,但仍然无法删除任何项或所有项。 - Lion King
2个回答

44
使用 QListWidget::takeItem 的一种方式来从 QListWidget 中移除项目,该函数会移除并返回该项。
QList<QListWidgetItem*> items = ui->listWidget->selectedItems();
foreach(QListWidgetItem * item, items)
{
    delete ui->listWidget->takeItem(ui->listWidget->row(item));
}

另一种方法是使用 qDeleteAll

qDeleteAll(ui->listWidget->selectedItems());

好的回答。请注意,这里关于 qDeleteAll 的示例仅用于说明......它仅删除了 UI 中选择的项目。qDeleteAll(ui->listWidget->items()); 清除了所有条目。一般而言,qDeleteAll(someListOfValidItems); 可以完成任务。 - Fox
谢谢,但第一种方法出现了错误“QModelIndex QListWidget :: indexFromItem(QListWidgetItem *)const”是受保护的。 - Lion King
@LionKing 你是对的。你应该使用QListWidget::row。答案已经更新。 - Nejat
3
removeItemWidget 只会移除设置在项上的部件。若要移除整行,应使用 takeItem 并将其删除以释放内存。参见:http://doc.qt.io/qt-5/qlistwidget.html#removeItemWidget - Nejat
@Nejat:这是手动的意思。但我不明白“removes the widget set on the item”是什么意思。什么是“widget set”,或者“在项目上设置widget”是什么意思? - Youda008
显示剩余3条评论

8
为您提供使用 removeItemWidget 的解决方案:
QList<QListWidgetItem*> items = ui->listWidget->selectedItems();

foreach(QListWidgetItem* item, items){
    ui->listWidget->removeItemWidget(item);
    delete item; // Qt documentation warnings you to destroy item to effectively remove it from QListWidget.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接