QT QLabel之Drag拖放复制图片测试
效果图
这里需要mousePressEvent定义好QMimeData的data数据格式
TestWidget::TestWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::TestWidget)
{
ui->setupUi(this);
setAcceptDrops(true);//窗口允许拖放
this->setWindowTitle("Drag测试");
QLabel *lb1=ui->label1;
QPixmap pix(":res/f1.png");
lb1->setPixmap(pix);
lb1->resize(pix.size());
}
void TestWidget::mousePressEvent(QMouseEvent *event)
{
QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
if (child==NULL){
return;
}
if(!child->inherits("QLabel"))//如果不是QLabel则直接返回
return;
QPixmap pixmap = *child->pixmap();//获取QLabel中的图片
//if(&pixmap==NULL){return;}
QByteArray itemData;
QDataStream dataSteam(&itemData,QIODevice::WriteOnly);
dataSteam<<pixmap<<QPoint(event->pos()-child->pos());
QMimeData *mimeData = new QMimeData;
mimeData->setData("testimage/png",itemData);
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(pixmap);
drag->setHotSpot(event->pos()-child->pos());
drag->exec(Qt::CopyAction | Qt::MoveAction,Qt::CopyAction);
}
void TestWidget::dragEnterEvent(QDragEnterEvent *event)
{
if(event->mimeData()->hasFormat("testimage/png"))
{
event->setDropAction(Qt::MoveAction);
event->accept();
}else
event->ignore();
}
void TestWidget::dropEvent(QDropEvent *event)
{
QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
if (child==NULL){//如果目标为空QLabel直接返回
event->ignore();
return;
}
if(!child->inherits("QLabel"))//如果目标不是QLabel直接返回
{
event->ignore();
return;
}else{
//如果有自定义的MIME类型数据
if(event->mimeData()->hasFormat("testimage/png"))
{
QByteArray itemData = event->mimeData()->data("testimage/png");
QDataStream dataStream(&itemData,QIODevice::ReadOnly);
QPixmap pixmap;
QPoint offset;
dataStream>>pixmap>>offset;
child->setPixmap(pixmap);//在目标QLable设置图片
event->setDropAction(Qt::MoveAction);
event->accept();
}else
event->ignore();
}
}