2013-11-15 93 views

回答

2

您必须使用QDrag*对象。 然后重新实现:

virtual void mousePressEvent(QMouseEvent * event); 
virtual void mouseReleaseEvent(QMouseEvent * event); 
virtual void mouseMoveEvent(QMouseEvent *event); 

(拖动开始的地方),你会管理的起点(在那里你放下小部件)的事件和结束点内。您还将使用MIME协议来允许框架管理拖放操作。

上拖放

一个更有用的文章是这样的:Drag 'n drop

0

我想最简单的方法是创建eventFilter类,在该类中将拖放事件和install它(someWidget->installEventFilter)过滤到您想要拖放的所有小部件。从文档实例 - here

更新:

与eventfilter的事情是,你并不需要继承所有小组件让他们有拖放。只需在你想要过滤的任何小部件上安装过滤器,它就会拥有它。

至于过滤器本身,它并不总是阻止事件等(它会这样做,如果这是你的意图)。这仅仅是人们如何使用它的例子。

只是拖放的无数选项之一:在dropEvent,dragMoveEvent,dragEnterEvent您的过滤器将可能记住指向你想要放弃的指针,并在dropEvent与对象发出信号,该事件持有指针并抓住它小部件放在哪里,就是这样,任何安装了过滤器的小部件都会有拖放。

事件过滤器的全部重点不在于继承和连接每个单独的小部件,如果您有公共事件类型,您希望以类似的方式捕获和处理,例如拖放事件。

我认为你知道如何拖放,但是认为用相同的代码重写所有小部件的重写事件可能是不对的。所以我向你展示了如何使用一个eventfilter轻松完成所有想要拖放的小部件。

+0

从我可以从你的链接了解,eventFilter是可以阻止事件或将其转发到该对象的类。我不需要那个。我可以连接信号和插槽和/或子类小部件并覆盖方法。问题是我必须连接/重写/等,使其工作,并有一些标准,测试和方便的方式做到这一点。 – alkedr

+0

@alkedr好的,我已经更新了eventfilter背后的原因 – Shf