如果为空,则从 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
信号,而不管是否输入了任何新数据是否进入模型。
我正在使用 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
信号,而不管是否输入了任何新数据是否进入模型。