Qt如何实现拖拽功能?

drag.gif

如上图所示,如何实现通过拖拽的方式交换两个按钮的文本?


严格的说应该叫拖放方式,它包含了拖动和放置两个部分。拖动通过drag实现,放下通过dropEvent事件实现。该例子有点特殊就是拖动和放下的对象都是按钮,所以拖动和放下都是在同一个类中实现。具体实现步骤如下:


  1. 从QPushButton类派生一个类,用以重写事件。

    image.png

        需要重写的事件有mouseMoveEvent,在该事件中实现拖动的操作,dropEvent事件中实现放下的操作。而dragEnterEvent事件在dropEvent之前执行,为了让拖拽事件往下传递,所以也需要重写该事件。

    

    2.让按钮接收放下事件

image.png

    必须调用setAcceptDrops为true,否则不会调用dragEnterEvent和dropEvent。

    

    3.创建QDrag对象

    image.png

    在鼠标移动的事件中创建QDrag对象,这样更符合操作的习惯。创建QDrag对象后要为它设置一个QMimeData,这里设置一个文本类型的数据,内容为当前按钮的文本。最后调用QDrag的exec函数,这样拖动部分的功能就实现了。 


    4.实现放下功能

image.png

  在dropEvent事件中获取拖拽事件的数据,event->mimeData()返回的就是QMimeData。调用this->setText(event->mimeData()->text())实现了将当前按钮的文本设置为拖拽源对象的文本。

  event->source()可以获取事件的源对象,在此例中源和目标对象都是DragButton。


    5.重写dragEnterEvent

image.png

    为了让事件传递,调用event->accept()。自此DragButton就完成了。


    6.最后在界面中创建几个DragButton对象测试一下即可。


    测试环境:windows 10    Qt5.9


    


演示站
上一篇:Qt如何实现蜂鸣声?
下一篇:无聊用Qt写个五子棋(一)

发表评论