Qt拖放的操作基本上可以分为三部分:获取记录需要的数据(QMimeData),拖动操作(Drag),放下操作(Drop);
QMimeData:多媒体数据类,拖放事件通过该对象传递数据,支持:文本,html数据,合法路径,图片,颜色等;
Drag:拖放是用户在程序中复制或移动数据的一种直观方式,它处理拖放操作的大部分细节
QDropEvent:提供一个拖放操作完成时触发的事件
以拖放一个图片为例:
void Widget::mousePressEvent(QMouseEvent *e)//鼠标点击事件
{
QLabel*child=static_cast<QLabel*>(childAt(e->pos()));//获取鼠标点击位置的控件
if(!child)
{
return;
}
QPixmap pixmap=*child->pixmap();//获取该控件上的图片信息
QByteArray itemData;
QDataStream dataStream(&itemData,QIODevice::WriteOnly);
dataStream<<pixmap<<QPoint(e->pos()-child->pos());
QMimeData*mimeData=new QMimeData;//记录需要的数据信息
mimeData->setData("appDrop",itemData);
QDrag*drag=new QDrag(this);//创建拖放操作
drag->setMimeData(mimeData);//关联数据,这时的拖放过程中就带上数据了
pixmap=pixmap.scaled(pixmap.width()*0.1,pixmap.height()*0.1);
drag->setPixmap(pixmap);//设置拖动时鼠标下的图片显示
drag->setHotSpot(e->pos());//位置,可注释下看效果
QPixmap tempPixmap=pixmap;
QPainter painter;
painter.begin(&tempPixmap);
drag->exec(Qt::CopyAction|Qt::MoveAction,Qt::CopyAction);//触发拖动事件,可以开始拖动
}
将内容拖到要放置的地方/控件上,松开鼠标后触发该函数
void Widget::dropEvent(QDropEvent *e)
{
if(e->mimeData()->hasFormat("appDrop"))//判断拖动操作上携带的数据是否存在
{ 将携带的数据解析出来,解析成原有的图片,文字,位置等信息
QByteArray itemData=e->mimeData()->data("appDrop");
QDataStream dataStream(&itemData,QIODevice::ReadOnly);
QPixmap pixmap;
QPoint offset;
dataStream>>pixmap>>offset;
//在放置位置进行显示数据操作
ui->label_2->setPixmap(pixmap);//前提setAcceptDrops(true);
}
}
//拖放鼠标进入目标控件
void Widget::dragEnterEvent(QDragEnterEvent *e)
{
if(e->mimeData()->hasFormat("appDrop"))
{
if(e->source()==this)
{
e->setDropAction(Qt::MoveAction);
e->accept();
}
else{
e->acceptProposedAction();
}
}else
{
e->ignore();
}
}
setAcceptDrops(bool);//设置部件是否接受放下事件(drop),
event->acceptProposedAction()//把拖放操作设置为建议的操作并接受该事件
event->ignore()//忽略该数据,用来处理不可用的数据
enum DropAction {
CopyAction = 0x1,//将数据复制到目标
MoveAction = 0x2,//将数据从源移动到目标
LinkAction = 0x4,//创建从源到目标的链接
ActionMask = 0xff,//无解释
TargetMoveAction = 0x8002,//
IgnoreAction = 0x0 //忽略操作(不处理数据)
};
发布了104 篇原创文章 ·
获赞 22 ·
访问量 4万+