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