题
我有一扇窗户,里面有几个容器。在它们之间实现拖放的最简单方法是什么?
解决方案
你必须使用一个 QDrag*
目的。然后重新实现:
virtual void mousePressEvent(QMouseEvent * event);
virtual void mouseReleaseEvent(QMouseEvent * event);
virtual void mouseMoveEvent(QMouseEvent *event);
在这些事件中,您将管理起点(拖动开始的位置)和终点(放置小部件的位置)。您还将使用 MIME 协议来允许框架管理拖放操作。
关于拖放的更有用的文章是这样的: 拖放
其他提示
我想最简单的方法是创建 eventFilter
类,您可以在其中过滤拖放事件和 安装 它 (someWidget->installEventFilter
) 到您想要拖放的所有小部件。文档中的示例 - 这里
更新:
eventfilter 的问题在于,您不需要对所有小部件进行子类化即可让它们进行拖放。只需在任何您想要 dnd 过滤器的小部件上安装过滤器,它就会拥有它。
至于过滤器本身,它并不总是阻止事件等(如果这是您的意图,它会这样做)。这只是一个如何使用它的示例。
这只是无数拖放选项之一:在 dropEvent、dragMoveEvent、dragEnterEvent 中,您的过滤器可能会记住指向您要放置的内容的指针,并在 dropEvent 中向该对象发出信号,该事件保存指向您放置它的小部件的指针并捕获它,就是这样,任何具有以下功能的小部件安装的过滤器将具有拖放功能。
事件过滤器的全部要点是,如果您具有常见的事件类型,您希望以类似的方式捕获和处理(例如拖放事件),则不必费心子类化和连接每个小部件。
我假设您知道如何拖放,但认为用相同的代码一遍又一遍地覆盖所有小部件中的事件可能不太正确。所以我向您展示了如何使用一个事件过滤器轻松完成您想要拖放的所有小部件。
不隶属于 StackOverflow