C ++从QListWidget删除自定义小部件

时间:2018-07-26 16:53:17

标签: c++ qt

我到处都在寻找这个问题,但似乎没人能找到答案。我使用setItemWidget在QListWidget中添加了QProgressWidget。我目前正在尝试通过按一下按钮删除进度条。

我打算让列表小部件看起来像这样

1

这是我用来插入名称和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项目和进度条时,我得到了

2

由于我将两个项目接连插入,因此我假设它们的位置分别为i和i + 1,但我显然是错的。谁能告诉我如何删除QListWidget中插入的小部件?

1 个答案:

答案 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;
    }
}