【问题标题】:Remove editable item from QListWidget if empty如果为空,则从 QListWidget 中删除可编辑项
【发布时间】:2018-10-28 18:23:37
【问题描述】:

我使用的是 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 信号。
  • @Dmitry 完美运行,谢谢!对我的代码的唯一更改是绑定到closeEditor 而不是commitData。如果您创建答案,我会将其标记为已接受。
  • 很高兴它有帮助,将其发布为答案。

标签: c++ qt qt4


【解决方案1】:

您可以连接到代理的closeEditor 信号而不是commitData 信号:当编辑器关闭时,无论是否有任何新数据输入到模型中,都会发出closeEditor 信号。

【讨论】:

  • 有一个微妙的情况是它无法处理的,这是有问题的:当用户插入一个新项目时,项目的文本最初是空的,并且启动了该项目的编辑。到目前为止这么好。现在,如果用户键入一些内容然后按 Escape,则调用 slot_item_edited()path 不为空(它包含用户键入的任何内容),但是该项目最终肯定会以空文本创建。有什么想法吗?
  • 嗯,你可以有一组指向 QLineEdit 的指针,为此调用了 commitData。为此,您需要将专用插槽连接到commitData,这会将指向编辑器的指针添加到该集合中。然后在连接到closeEditor 的插槽中,您需要检查commitData 是否是从正在关闭的编辑器发送的。这样您就可以判断编辑器中的数据是否已放入模型中。
  • 感谢您的想法。我按照您的描述做了一些事情,但更简单一些:我在commitData 和连接到closeEditor 的插槽中将edit_committed 标志设置为true,如果edit_committed 为false,则删除该项目。
猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 2020-06-18
  • 2013-04-03
  • 1970-01-01
相关资源
最近更新 更多