Qt Drag and Drop 学习笔记

 

Qt Drag and Drop 学习笔记


 

 

Drag&Drop的直观效果可以从QtDesigner中的控件拖动中看出来。

Drag&Drop可以实现同一个控件或者两个控件之间传递数据。其传递的数据通过QMimeData进行传递,默认的MineType包括Textimage,也可以自行定义类型。

 

具体做法

Qt中实现的时候是通过WidgetdragEnterEventdropEvent等来完成的。具体的使用方法可以参照QtAssitanse. Below is the common usage of Drag & Drop.

对于需要可拖拽的控件使用如下:

 

void DragWidget::mouseMoveEvent(QMouseEvent *event) { if (!(event->buttons() & Qt::LeftButton)) return; if ((event->pos() - dragStartPosition).manhattanLength() < QApplication::startDragDistance()) return; QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setData(mimeType, data); drag->setMimeData(mimeData); Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction); } 

而对于需要接受Drops的控件,在初始化的时候设置其可接受Drops:


Window::Window(QWidget *parent) : QWidget(parent) { ... setAcceptDrops(true); } 

然后对此可接受DropsWindow控件重载dragEnterEventdropEvent.根据Event相关的mimeData来判断是否接收动作。

 

void Window::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasFormat("text/plain")) event->acceptProposedAction(); } void Window::dropEvent(QDropEvent *event) { textBrowser->setPlainText(event->mimeData()->text()); mimeTypeCombo->clear(); mimeTypeCombo->addItems(event->mimeData()->formats()); event->acceptProposedAction(); } 

 

 

扩展

通过QMimeData来传递数据,QMimeData可以通过自定义数据类型来扩展:

void mouseMoveEvent(QMouseEvent* event) { QDrag * drag = new QDrag(this); QMimeData* mimeData = new QMimeData; QByteArray byteArray; QDataStream dataStream(&byteArray,QIODevice::WriteOnly); dataStream<<(int)type_; dataStream<<event->pos(); mimeData->setData("application/ui_element_movement",byteArray); drag->setMimeData(mimeData); qDebug()<<mimeData; Qt::DropAction dropAction = drag->exec(Qt::MoveAction); event->accept(); } 


这样,在可接收Drop的控件里面,则可以通过判断mimeData是否包含”application/ui_element_movement”来处理特定的动作。

 

 

也可以直接通过继承QMimeData来设置传输的数据,QtDesigner使用的是这种方法。

 

 

 

 

你可能感兴趣的:(Qt Drag and Drop 学习笔记)