Qt: best way to delegate a drag and drop to children

落爺英雄遲暮 提交于 2019-12-12 15:55:12

问题


I'm using drag and drop on QWidget, I have reimplemented dragEnterEvent, dragLeaveEvent, dragMoveEvent and dropEvent, and that works well.

In my QWidget, I have other QWidget children, and I want them to manage drag and drop too. The issue is my parent QWidget catch the dnd events, so my children don't get it. What is the best way to say "when you are above a child widget, the child get the dnd events" ?

Thanks

Edit:

my widgets looks like this:

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

my parent widget and child widget are of the same class.

The code is quite basic, it's similar to this:

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
}

the dragEnterEvent of my child is never called.


回答1:


From the drag-and-drop documentation:

To be able to receive media dropped on a widget, call setAcceptDrops(true) for the widget, and reimplement the dragEnterEvent() and dropEvent() event handler functions.

Here's the quick summary:

  1. The child should call setAcceptDrops(true).
  2. The child should reimplement the dragEnterEvent and accept its proposed action
  3. The child should reimplement the dropEvent and accept its proposed action.

If any of the above are not true then the parent will have a chance to handle the drop.



来源:https://stackoverflow.com/questions/7209832/qt-best-way-to-delegate-a-drag-and-drop-to-children

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!