0
点赞
收藏
分享

微信扫一扫

QT QLabel之前Drag拖放复制图片测试

小贴贴纸happy 2023-11-13 阅读 46

QT QLabel之Drag拖放复制图片测试

效果图

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();
    }
}

举报

相关推荐

0 条评论