【问题标题】:Remove item from QListWidget by dropping it outside the widget?通过将项目放在小部件之外从 QListWidget 中删除它?
【发布时间】:2012-02-12 23:33:20
【问题描述】:

我在网上搜索了实现这一点的可能性,但没有找到解决方案。有没有一种简单的方法可以从列表中删除放置在非接收区域甚至应用程序窗口之外的项目?

到目前为止,我接受删除键以通过快捷方式删除项目:

QShortcut *shortcut = new QShortcut(QKeySequence(Qt::Key_Delete), myList);
shortcut->setContext(Qt::WidgetShortcut);
connect(shortcut, SIGNAL(activated()), this, SLOT(deleteSelection()));

但是由于我通过拖放将项目添加到列表中,因此我也希望能够以相同的方式删除它们。列表中的项目也可以通过拖放进行排序。

感谢任何提示或链接。

【问题讨论】:

  • 在 dragLeaveEvent 而不是 dropEvent 上删除它们
  • @KamilKlimek 所以你认为我必须对小部件进行子类化才能做到这一点?难道没有别的办法了吗?我会认为这是 QListWidget 想要的非常标准的东西。
  • 尝试安装事件过滤器并从中捕获 dropEvent

标签: qt drag-and-drop qlistwidget


【解决方案1】:

这似乎对我有用:

  • 拖放操作应为Qt::MoveAction
  • 确保QListWidget 的父级(例如QDialog)具有以下内容:
    • dragEnterEvent() 已实施
    • dropEvent() 已实现(忽略此处的 mime 数据)
    • setAcceptDrops(true);

Qt::MoveAction 中忽略dropEvent() 中的mime 数据应该等同于项目删除操作。

祝你好运!

【讨论】:

  • 在 Qt 设计器中,我将所有属性设置为您建议的内容,并在列表小部件上安装了一个事件过滤器,正如卡米尔所说,以捕捉 dragEnter/dragLeave/dropEvents 但事件发生的场合被解雇或在我看来几乎不是随机的。例如,dragLeaveEvent 似乎根本没有被触发。事件过滤器方法对我来说很有意义,并且是否触发事件似乎是一个非常特定于 Qt 的问题,所以我发布了一个更详细的问题here,以防您感兴趣。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
相关资源
最近更新 更多