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

时间:2011-08-26 19:50:19

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

我在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 个答案:

答案 0 :(得分:2)

来自drag-and-drop documentation

  

为了能够接收窗口小部件上删除的媒体,请为窗口小部件调用setAcceptDrops(true),然后重新实现dragEnterEvent()dropEvent()事件处理函数。

以下是快速摘要:

  1. 孩子应致电setAcceptDrops(true)
  2. 孩子应该重新实施dragEnterEvent并接受其建议的行动
  3. 孩子应重新实施dropEvent并接受proposed action
  4. 如果上述任何一项不成立,则父母将有机会处理掉落。

相关问题