如上图所示,如何实现通过拖拽的方式交换两个按钮的文本?
严格的说应该叫拖放方式,它包含了拖动和放置两个部分。拖动通过drag实现,放下通过dropEvent事件实现。该例子有点特殊就是拖动和放下的对象都是按钮,所以拖动和放下都是在同一个类中实现。具体实现步骤如下:
- 从QPushButton类派生一个类,用以重写事件。
需要重写的事件有mouseMoveEvent,在该事件中实现拖动的操作,dropEvent事件中实现放下的操作。而dragEnterEvent事件在dropEvent之前执行,为了让拖拽事件往下传递,所以也需要重写该事件。
2.让按钮接收放下事件
必须调用setacceptDrops为true,否则不会调用dragEnterEvent和dropEvent。
3.创建QDrag对象
在鼠标移动的事件中创建QDrag对象,这样更符合操作的习惯。创建QDrag对象后要为它设置一个QMimeData,这里设置一个文本类型的数据,内容为当前按钮的文本。最后调用QDrag的exec函数,这样拖动部分的功能就实现了。
4.实现放下功能
在dropEvent事件中获取拖拽事件的数据,event->mimeData()返回的就是QMimeData。调用this->setText(event->mimeData()->text())实现了将当前按钮的文本设置为拖拽源对象的文本。
event->source()可以获取事件的源对象,在此例中源和目标对象都是DragButton。
5.重写dragEnterEvent
为了让事件传递,调用event->accept()。自此DragButton就完成了。
6.最后在界面中创建几个DragButton对象测试一下即可。
测试环境:windows 10 Q