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
}
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。