【Qt学习笔记】13.拖放技术:Drag & Drop
1、接受拖放
Drag & Drop 是一个界面操作,用于在两个窗口间传递数据。
Drag Source: 拖放源窗口
Drag Target: 拖放目标窗口
拖放操作:
1、在源窗口:选中目标,按下鼠标,移动,拖至目标窗口(Drag)
2、在目标窗口:取消鼠标,到指定位置,松开鼠标(Drop)
(按下ESC取消操作)
MIME:
MIME(Multipurpose Internet Mail Extensions)被传递的数据以MIME格式传送,它是多组type-data数据:(type0, data0) (type1, data1) (type2, data2) ... (type-n, data-n)
其中,
type:字符串,用于指定数据类型,如:“text/plain”
data:字节数组,即要传递的数据
接受拖放的步骤:
// 接受拖放 setAcceptDrops( true ); // 重写 void dragEnterEvent( QDragEnterEvent* event ); void dragLeaveEvent( QDragLeaveEvent* event ); void dragMoveEvent( QDragMoveEvent* event ); void dropEvent( QDropEvent* event );
小练习:
实现一个简单的窗体,当文本被拖入该窗体时,窗体内的label控件会显示拖入的文本内容
代码:
#include <QDragEnterEvent> #include <QDragLeaveEvent> #include <QDragMoveEvent> #include <QDropEvent> #include <QMimeData> #include "Test13_1a_12_18.h" Test13_1a_12_18::Test13_1a_12_18(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); setAcceptDrops(true); //设置:接受拖放 } // 进入 void Test13_1a_12_18::dragEnterEvent(QDragEnterEvent *event) { if ( event->mimeData()->hasFormat("text/plain") ) { event->acceptProposedAction(); } } //松开鼠标 void Test13_1a_12_18::dropEvent(QDropEvent *event) { if (event->mimeData()->hasFormat("text/plain")) { QString text = event->mimeData()->text(); ui.label->setText(text); } }
二、发起拖放
在QWidget窗口中发起一个Drag操作 步骤:
1、鼠标按下
2、鼠标移动,当移动一段距离后,认为是一个拖动操作。可以发起一个drag动作
实现方法:
1、派生一个子类
2、重写函数:
virtual void mouseMoveEvent( QMouseEvent* event ); virtual void mousePressEvent( QMouseEvent* event );
同时传送多种MIME数据:
mimeData->setHtml( "xxxxxxx" ); mimeData->setText( text ); mimeData->("123," dat); //自定义格式的数据 //data : QByteArray
void MyListWidget::mousePressEvent(QMouseEvent *event) { // 记下起点 m_dragPosition = event->pos(); m_dragItem = this->itemAt(m_dragPosition); // 记得调用父类的函数(保持原有的按键行为) QListWidget::mouseMoveEvent(event); } void MyListWidget::mouseMoveEvent(QMouseEvent *event) { // 只允许用左键拖动 if ( !(event->buttons() & Qt::LeftButton) ) { return; } // 移动一定距离后,才算是开始拖动 if ((event->pos() - m_dragPosition).manhattanLength() < QApplication::startDragDistance()) { return; } // 找到拖动的项 if (!m_dragItem) { return; } QString text = m_dragItem->text(); // 创建数据 QDrag* drag = new QDrag(this); QMimeData* mimeData = new QMimeData; mimeData->setText(text); drag->setMimeData(mimeData); // 启动拖放 start a drag Qt::DropAction result = drag->exec(Qt::CopyAction | Qt::MoveAction); // 检查操作是否成功 if (Qt::IgnoreAction != result) { } else { // 按住Ctrl键: Qt::CopyAction // 没按: Qt::RemoveAction } }