我正在使用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信号。

07-24 09:25