【Qt+FFmpeg】鼠标滚轮放大、缩小、移动——解码播放本地视频(三)

 上一期我们实现了播放、暂停、重播、倍速功能,这期来谈谈如何实现鼠标滚轮放大缩小和移动;如果还没看过上期,请移步

【Qt+FFmpeg】解码播放本地视频(一)_logani的博客-CSDN博客【Qt+FFmpeg】解码播放本地视频(二)——实现播放、暂停、重播、倍速功能_logani的博客-CSDN博客

其实播放视频就是播放一帧一帧的图片,鼠标滚轮放大缩小和移动就是对绘图事件中的图片位置进行操作

实现效果

目录

一、FFmpeg解码流程图

二、滚轮放大、缩小、移动功能实现

1.滚轮放大缩小

(1)需要定义的变量

(2)滚轮事件

(3)绘图事件中设置

2.移动

(1)鼠标点击事件中记录当前鼠标位置

 (2)鼠标移动事件 

(3)鼠标双击事件

一、FFmpeg解码流程图

二、滚轮放大、缩小、移动功能实现

1.滚轮放大缩小

(1)需要定义的变量

    double factor;//放大缩小的倍数
    int XPtInterval = 0;    //平移X轴的值
    int YPtInterval = 0;    //平移Y轴的值
    bool Pressed;           //鼠标是否被摁压
    QPoint oldPos;          //旧的鼠标位置


    setMouseTracking(true);//开启鼠标追踪
    this->Pressed = false;
    this->factor = 1.0;
    this->XPtInterval = 0;  
    this->YPtInterval = 0; 

(2)滚轮事件

void playVideoWidget::wheelEvent(QWheelEvent *event)//图片放大缩小
{
    double numDegrees = event->delta() / 8.0;
    double numSteps = numDegrees / 15.0;
    factor *= pow(1.1, numSteps);
    if (factor< 0.07)
    {
        factor = 0.07;
    }
    else if(factor>50)
    {
        factor = 50;
    }
    update();
}

(3)绘图事件中设置

设置放大缩小的倍数,同时进行平移操作

void playVideoWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    if(!this->image.isNull())//如果图片不为空
    {
        painter.translate(0+ XPtInterval, 0+ YPtInterval);//进行平移
        painter.drawImage(QRect(0,0,this->width()*factor,(this->height()-45)*factor),this->image);
    }
}

2.移动

(1)鼠标点击事件中记录当前鼠标位置

记录鼠标为点击状态

void playVideoWidget::mousePressEvent(QMouseEvent *event)
{
    oldPos = event->pos();
    Pressed = true;
}

 (2)鼠标移动事件 

当鼠标按下时,获取当前鼠标的位置,减去之前位置计算出移动的距离,绘图事件中进行偏移

当鼠标释放时,记录鼠标处于非点击状态 

void playVideoWidget::mouseMoveEvent(QMouseEvent *event)//移动
{
    if(Pressed!=false)//按下鼠标
    {
        this->setCursor(Qt::SizeAllCursor);//设置光标
        QPoint pos = event->pos();
        int xPtInterval = pos.x() - oldPos.x();//计算移动的距离
        int yPtInterval = pos.y() - oldPos.y();
        XPtInterval += xPtInterval;//加上偏移的距离
        YPtInterval += yPtInterval;
        oldPos = pos;//更新位置
        update();
    }
}

void playVideoWidget::mouseReleaseEvent(QMouseEvent *event)//鼠标释放
{
    Pressed = false;
    this->setCursor(Qt::ArrowCursor);//设置光标
}

(3)鼠标双击事件

鼠标双击复原为初始状态

void playVideoWidget::mouseDoubleClickEvent(QMouseEvent *event)//双击初始化为开始
{
    factor=1.0;
    XPtInterval = 0;
    YPtInterval = 0;
    update();
}

感谢观看!!!!

以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!

猜你喜欢

转载自blog.csdn.net/logani/article/details/127281589