Qt:将拖放委托给孩子的最佳方式

Posted

技术标签:

【中文标题】Qt:将拖放委托给孩子的最佳方式【英文标题】:Qt: best way to delegate a drag and drop to children 【发布时间】:2011-11-04 19:22:31 【问题描述】:

我在 QWidget 上使用拖放,我重新实现了 dragEnterEvent、dragLeaveEvent、dragMoveEvent 和 dropEvent,效果很好。

在我的 QWidget 中,我还有其他 QWidget 孩子,我希望他们也可以管理拖放。问题是我的父母 QWidget 捕捉到了 dnd 事件,所以我的孩子没有得到它。 “当您在子小部件之上时,孩子会收到 dnd 事件”的最佳说法是什么?

谢谢

编辑:

我的小部件如下所示:

----------------------------------------
|            Parent Widget             |
|       ------------------             |
|       |  Child Widget  |             |
|       |                |             |
|       ------------------             |
|                                      |
----------------------------------------

我的父小部件和子小部件属于同一类。

代码很基础,类似这样:

DnDWidget::DnDWidget(QWidget* parent)
    : QWidget(parent)

    setAcceptDrops(true);


void DnDWidget::dragEnterEvent (QDragEnterEvent* event )

    qDebug() << "dragEnterEvent";
    if (event->mimeData()->hasFormat("foo/bar"))
        event->acceptProposedAction();


void DnDWidget::dragMoveEvent (QDragMoveEvent* event )

    qDebug() << "dragMoveEvent";
    //do visual feedback stuff

我孩子的 dragEnterEvent 永远不会被调用。

【问题讨论】:

【参考方案1】:

来自drag-and-drop documentation:

为了能够接收放置在小部件上的媒体,请为小部件调用 setAcceptDrops(true),并重新实现 dragEnterEvent()dropEvent() 事件处理函数。

以下是快速摘要:

    孩子应该打电话给setAcceptDrops(true)。 孩子应重新实现dragEnterEvent 并接受其建议的操作 孩子应该重新实现dropEvent 并接受它的proposed action。

如果以上任何一项不正确,那么父母将有机会处理掉落。

【讨论】:

我的孩子确实会调用这些方法。问题是它的父母捕获了事件,所以我孩子的 dragEnterEvent 永远不会被调用。到目前为止,我认为解决的办法是自己通过QApplication::sendEvent重新发送事件,但是不知道有没有更好的方法。 孩子将首先看到事件。确保您的函数签名完全匹配,并且基类正在按预期调用重新实现的方法。 是的,就是这样:我的子类和我的父类实际上是一样的。我可以看到我父母的DnD视觉反馈,我父母的dragEnterEvent和dragMoveEvent被调用了,但是当我越过一个孩子QWidget时,我父母的dragLeaveEvent没有被调用,我孩子的dragEnterEvent也没有。 好的,我发现了问题:我的子小部件实际上在 QScrollArea 内。我可以看到 QScrollArea,但我的小部件是空的,而且我没有意识到它没有大小(所以我从来没有拖过它)。如果我设置一个 setMinimumSize,一切正常。现在我觉得很愚蠢:)。感谢您的回答 大声笑。感谢您的诚实回复:)。

以上是关于Qt:将拖放委托给孩子的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

将拖放文件拖放到 Python 脚本上

NSCollectionView 拖放:大多数委托事件没有被调用

QT 模型/视图 编程 委托篇

通过拖动委托向上或向下拖动一行来重新排列表格中的部分(iOS 11)

Qt4:QAbstractTableModel 拖放 w/o MIME

将业务逻辑与控制器解耦的最佳方式