我到处都在寻找这个问题,但似乎没人能找到答案。我使用setItemWidget在QListWidget中添加了QProgressWidget。我目前正在尝试通过按一下按钮删除进度条。
我打算让列表小部件看起来像这样
这是我用来插入名称和qprogress栏的代码
//append qstring
ui->budget_list_2->addItem(expense_name);
//append qprogress bar
ui->budget_list_2->addItem(tmp);
ui->budget_list_2->setItemWidget(tmp, bar);
这是我用来删除两个项目的代码
for(int i = 0; i < ui->budget_list_2->count(); i++){
if(ui->budget_list_2->item(i)->text() == remove){
tmp = ui->budget_list_2->takeItem(i);
delete tmp;
tmp = ui->budget_list_2->takeItem(i+1);
delete tmp;
//delete prog_bars.take(remove);
break;
}
}
但是当我同时删除qstring项目和进度条时,我得到了
由于我将两个项目接连插入,因此我假设它们的位置分别为i和i + 1,但我显然是错的。谁能告诉我如何删除QListWidget中插入的小部件?
答案 0 :(得分:0)
我在其中的注释中解释了代码。问题是,删除i-th item
后,(i+1)-th item
将是i-th item
,而(i+2)-th
项将是(i+1)-th item
。这就是为什么您在代码中删除了2 QString
。
for (int i = 0; i <ui->budget_list_2->count(); i++){
if (ui->budget_list_2->item(i)->text() == remove)
{
//remove (i+1)-th item first
auto barItem = ui->budget_list_2->item(i + 1);
if (barItem)
{
//delete bar widget
auto bar = (QProgressBar*)ui->budget_list_2->itemWidget(barItem);
if (bar)
{
bar->deleteLater();
}
//remove and delete bar item
delete ui->budget_list_2->takeItem(i + 1);
}
//remove string from ui->budget_list_2
auto strItem = ui->budget_list_2->takeItem(i);
if (strItem)
{
delete strItem;
}
break;
}
}