【问题标题】:Qt: best way to delegate a drag and drop to childrenQt:将拖放委托给孩子的最佳方式
【发布时间】: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 永远不会被调用。

【问题讨论】:

    标签: c++ qt drag-and-drop


    【解决方案1】:

    来自drag-and-drop documentation

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

    以下是快速摘要:

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

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

    【讨论】:

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