通过文本内容删除 QListWidget 项

Posted

技术标签:

【中文标题】通过文本内容删除 QListWidget 项【英文标题】:Delete QListWidget item by text content 【发布时间】:2017-02-23 22:43:46 【问题描述】:

我需要通过文本内容删除一个 qlistwidget 项

我试过了:

QString mstring =  "Programmer II";

QList<QListWidgetItem *> items = ui->listJobs->findItems(mstring,  Qt::MatchExactly);
    if (items.size() > 0)
        ui->listJobs->takeItem( ui->listJobs->currentRow() );

...和各种排列,但我错过了一些东西。上面的代码会编译,但不会从 qlistwidget 中删除项目。

【问题讨论】:

可以显示其他项的值 对不起,我不明白。 其他项目的值是多少,即文本? 请不要添加问题的答案。如果您解决了自己的问题,无论是否受到其他答案的启发,请将您的解决方案发布为答案并回滚对问题的编辑。 【参考方案1】:

代码没有说明currentRow 的值是什么,但findItems 没有设置它,因此它不太可能与您尝试删除的值相关联。我看不到任何方法可以使用 findItems 的结果并获取要删除的行。我认为您必须遍历内容,比较每个项目的文本,然后删除匹配的内容。您可能希望以相反的顺序执行循环;否则,一旦您删除了一个项目,循环计数器将不再匹配列表项的行号。

【讨论】:

currentRow 是什么意思,这不是问题? 在您发布的代码中,调用是“takeItem (ui->listJobs->currentRow())”。这不可能是你想要的。 我最初发布的代码是基于对 qlistwidget api 的完全误解。根据您的建议,我发布的循环有效,非常感谢! 很高兴它有帮助。只要只有一项要查找和删除,您的解决方案就可以。如果有两个或更多,此循环将正确删除第一个,但其他循环可能会中断。例如,如果需要删除第 10 行和第 11 行,则第 10 行将被正确删除,然后第 11 行立即成为新的第 10 行。但是您的循环将增加到 11,并且永远不会匹配以前的 11 行。您可以通过反转循环并倒计时到 0 来解决此问题。 从最初的问题转移:根据@goug 的回答,我测试了这个例程并且它有效。 for(int i = 0; i listJobs->count(); ++i) QString str = ui->listJobs->item(i)->text(); if (str==mstring) 删除 ui->listJobs->item(i);

以上是关于通过文本内容删除 QListWidget 项的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyqt5 QlistWidget中选择当前项目

PyQt:如何获得大部分 QListWidget

从PyQt5中的QListWidget中删除项目

列表控件QListWidget

Qt:如何突出显示 QListWidget 中的重复项? (qtjambi)

PyQt4 - 从 QListWidget 中删除项目小部件