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:将拖放委托给孩子的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章
NSCollectionView 拖放:大多数委托事件没有被调用
通过拖动委托向上或向下拖动一行来重新排列表格中的部分(iOS 11)