我有一个带有几个容器的窗口。在它们之间实现拖放的最简单方法是什么?
答案 0 :(得分:2)
您必须使用QDrag*
对象。
然后重新实现:
virtual void mousePressEvent(QMouseEvent * event);
virtual void mouseReleaseEvent(QMouseEvent * event);
virtual void mouseMoveEvent(QMouseEvent *event);
在这些事件中,您将管理起点(拖动开始的位置)和终点(放置小部件的位置)。您还将使用MIME协议来允许框架管理拖放操作。
关于拖放的更有用的文章是:Drag 'n drop
答案 1 :(得分:0)
我想,最简单的方法是创建eventFilter
类,您可以在其中过滤拖放事件,并将install它(someWidget->installEventFilter
)过滤到所有小部件,其中你想要拖放。文档示例 - here
更新
使用eventfilter的事情是,您不需要为所有小部件创建子类,以便进行拖放操作。只需在您想要进行过滤的任何小部件上安装过滤器,它就会拥有它。
至于过滤器本身,它并不总是阻止事件等(如果这是你的意图,它会这样做)。它只是一个如何使用它的例子。
使用拖放操作的无数选项之一:在dropEvent,dragMoveEvent,dragEnterEvent中,您的过滤器可能会记住指向您想要删除的内容,并在dropEvent中发出带有对象的信号,该事件保存指针并使用小部件捕获它放下它的地方就是这样,任何安装了过滤器的小部件都会拖放。
事件过滤器的重点不在于子类化和连接每个单独的小部件,如果你有公共事件类型,你想以类似的方式捕获和处理,例如拖放事件。
我认为你知道如何拖放,但是认为在所有小部件中使用相同代码重复覆盖事件可能不是那么正确。所以我向您展示了如何使用一个eventfilter为您想要拖放的所有小部件轻松完成。