qt 实现label部件中的图片随鼠标移动

3 篇文章 0 订阅
2 篇文章 0 订阅

最近在做图片查看器,所以研究了一下这个东西!

首先给大家实现一下:

先在 .h 文件定义四个函数:

 void mousePressEvent(QMouseEvent *event);			//按下鼠标
 
    void dragEnterEvent(QDragEnterEvent *event);		//拖动进入
 
    void dragMoveEvent(QDragMoveEvent *event);			//拖动
 
    void dropEvent(QDropEvent *event);				//放下

函数实现:


void MainWindow::mousePressEvent(QMouseEvent *event)        //鼠标按下事件
{
    if(event->button() == Qt::LeftButton)
    {
        //第一步,获取图片。将鼠标位置的部件强制转换为QLabel型
        QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
        if(!child->inherits("QLabel"))
            return;
        QPixmap pixmap = *child->pixmap();
 
        //第二步,自定义MIME类型
        QByteArray itemData;
        QDataStream dataStream(&itemData,QIODevice::WriteOnly);
        //将图片信息,位置信息保存到字节数组中
        dataStream<<pixmap<<QPoint(event->pos() - child->pos());
 
        //第三步,将数据放入QMimeData中
        QMimeData *mimeData = new QMimeData;
        mimeData->setData("myImage/jpg",itemData);
 
        //第四步,将QMimelda中的数据放进QDrag
        QDrag *drag = new QDrag(this);
        drag->setMimeData(mimeData);
        drag->setPixmap(pixmap);
        drag->setHotSpot(event->pos() - child->pos());
 
        //第五步,给原图加阴影
        QPixmap tempPixmap = pixmap;
        QPainter painter;               //绘图
        painter.begin(&tempPixmap);
        //添加透明淡黑色阴影
        painter.fillRect(pixmap.rect(),QColor(127,127,127,127));
        painter.end();
        child->setPixmap(tempPixmap);
        setAcceptDrops(true);
        QLabel *label = new QLabel(this);
        label->setPixmap(pix);
        label->resize(pix.size());
 
 
        //第六步,执行拖动操作
        if(drag->exec(Qt::CopyAction | Qt::MoveAction,Qt::CopyAction) == Qt::MoveAction)
            child->close();
        else
        {
            child->show();
            child->setPixmap(pixmap);
        }
    }
}
 
void MainWindow::dragEnterEvent(QDragEnterEvent *event)    //拖动进入事件
{
    if(event->mimeData()->hasFormat("myImage/jpg"))
    {
        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
    else
        event->ignore();
}
 
void MainWindow::dragMoveEvent(QDragMoveEvent *event)       //拖动事件
{
    if(event->mimeData()->hasFormat("myImage/jpg"))
    {
        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
    else
        event->ignore();
}
 
void MainWindow::dropEvent(QDropEvent *event)       //放下事件
{
    if(event->mimeData()->hasFormat("myImage/jpg"))
    {
        QByteArray itemData = event->mimeData()->data("myImage/jpg");
        QDataStream dataStream(&itemData,QIODevice::ReadOnly);
        QPixmap pixmap;
        QPoint offset;
        dataStream>>pixmap>>offset; //使用数据流将字节数据读到QPixmap,QPoint变量中
        //新建标签,为其添加图片,并根据图片大小设置标签大小
        QLabel *newLabel = new QLabel(this);
        newLabel->setPixmap(pixmap);
        newLabel->resize(pixmap.size());
 
        ui->label = newLabel;       //其他所有操作只针对ui->label
 
        //是图片移动到放下的位置,不设置会默认显示在(0,0)
        newLabel->move(event->pos() - offset);
        newLabel->show();
        newLabel->setAttribute(Qt::WA_DeleteOnClose);
        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
    else
        event->ignore();
}
 

 ui->label = newLabel;       //其他所有操作只针对ui->label

这条语句是因为我其他的操作都是对Mainwindow中label进行的,移动会新建label,所以要把新建的label赋给Mainwindow中的label。


因为技术有限,还存在一些bug,希望多多指教!谢谢

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值