【问题标题】:C++ Delete a Custom Widget From QListWidgetC++ 从 QListWidget 中删除自定义小部件
【发布时间】:2018-07-27 11:34:28
【问题描述】:

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

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

1

这是我用来插入名称和进度条的代码

//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 中的小部件?

【问题讨论】:

  • 那么,删除文本后,进度条的索引会发生什么变化?尝试重用 i 或以相反的顺序删除它们...
  • 澄清一下,您想同时删除进度条和 QString 吗?如果是这种情况,是否可以更改您当前的实现,使budget_list_2 仅包含条形和qstring?如果您能够进行修改,删除它们将变得像遍历列表并从中删除所有内容一样简单。
  • @Thomas 哦,我明白了,这很有意义。根据我的理解,您所说的是在 takeItem(i) 之后,我将自动成为进度条的位置,我需要做的就是执行 takeItem(i) 并正确删除两次?
  • @Lucas 是的,这是一种方法。

标签: c++ qt


【解决方案1】:

我在里面解释了cmets中的代码。问题是,删除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;
    }
}

【讨论】:

    猜你喜欢
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2014-07-14
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多