如果为空,则从 QListWidget 中删除可编辑项

Remove editable item from QListWidget if empty

我正在使用 Qt 4.8.6。

我有一个QListWidget。当用户单击 添加 按钮时,一个新项目将插入到列表的末尾,并开始编辑该项目的文本:

void slot_add_item()
{
    auto* item = new QListWidgetItem(QString());
    item->setFlags(item->flags() | Qt::ItemIsEditable);
    listWidget->addItem(item);
    listWidget->setCurrentItem(item);
    listWidget->editItem(item);
}

基于 this comment,我正在监听 commitData 信号以在用户完成编辑项目时捕捉并在项目的文本为空时将其删除:

connect(
    listWidget->itemDelegate(), SIGNAL(commitData(QWidget*)),
    SLOT(slot_item_edited(QWidget*)));

...

void slot_item_edited(QWidget* widget)
{
    const QString path = reinterpret_cast<QLineEdit*>(widget)->text();
    if (path.isEmpty())
        delete listWidget->currentItem();
}

然而,这并没有捕捉到用户 取消 使用 Escape 键编辑的情况:在这种情况下, slot_item_edited() 没有被调用(预期)并且(空)项未删除。

知道如何在这种情况下删除该项目吗?

您可以连接到委托的 closeEditor 信号而不是 commitData 信号:当编辑器关闭时会发出 closeEditor 信号,而不管是否输入了任何新数据是否进入模型。