服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 基于Qt实现简易GIF播放器的示例代码

基于Qt实现简易GIF播放器的示例代码

2022-12-25 16:19wendy_ya C/C++

这篇文章主要介绍了如何利用Qt设计一个简易GIF播放器,可以播放GIF动画。其基本功能有载入文件、播放、暂停、停止、快进和快退,感兴趣的可以了解一下

一、项目介绍

利用Qt设计一个简易GIF播放器,可以播放GIF动画。其基本功能有载入文件、播放、暂停、停止、快进和快退。

 

二、项目基本配置

新建一个Qt案例,项目名称为“GIFTest”,基类选择“QMainWindow”,创建UI界面复选框的选中状态,完成项目创建。

 

三、UI界面设计

UI界面如下:

基于Qt实现简易GIF播放器的示例代码

界面中创建了8个控件,其名称和类型如下表所示:

序号 名称 类型 属性
movieLabel QLabel text:No movie loaded;
alignment:AlignCenter;
SizePolicy:Expanding;
frameLabel QLabel text:Current frame;
HorizontalSlider QSlider tickInterval:1
open QToolButton /
back QToolButton /
play QToolButton /
forward QToolButton /
stop QToolButton /

 

四、主程序实现

4.1 mainwindow.h头文件

首先,声明两个头文件:

#include<QFileDialog>
#include<QMovie>

然后声明若干个槽函数:

private slots:
  void on_open_clicked();
  void on_play_clicked();
  void on_stop_clicked();
  void on_back_clicked();
  void on_frameSlider_valueChanged(int value);//进度条改变槽函数
  void on_forward_clicked();
  void updateFrameSlider();//movie的进度条更新槽函数

声明三个私有变量:

private:
  QString currentMovieDirectory;//当前路径
  QMovie *movie;
  QString s="播放";//对播放和暂停按钮进行切换

4.2 mainwindow.cpp源文件

首先需要设置movie的缓存模式,这里我们要求当文件播放一遍后返回重新播放,所以使用CacheAll模式:

//新建movie
movie =new QMovie(this);
movie->setCacheMode(QMovie::CacheAll);//设置movie的缓存模式

然后设置movieLabel的背景颜色为Dark:

    ui->movieLabel->setBackgroundRole(QPalette::Dark);
  ui->movieLabel->setAutoFillBackground(true);//自动填充背景

首先要把图标文件xxx.png添加到生成的.pro根目录中去,然后右击movie,添加新文件,Qt资源文件,定位到根文件夹,命名为button,系统会自动生成.qrc文件。点击.qrc文件,在最下角前缀输入框将“/new/prefix1”改成“/”,然后点击添加,添加文件,将几个png文件选择添加,然后进行构建(小锤子),此时再点击.qrc就会看到png文件已经添加进来。

调用QPixmap将图片添加到button中,设置控件固定大小为30*30,setAutoRaise可以将button的外边框去除在鼠标滑过该button时会有浮出效果显示边框,这个效果比较好看。setToolTip函数可以使鼠标放在控件上时提示该控件可以执行的操作,代码如下:

    //打开文件
  ui->open->setIcon(QIcon(":img/open.png"));
  ui->open->setIconSize(QSize(30,30));
  ui->open->setAutoRaise(true);
  ui->open->setToolTip("Open a file");//工具栏提示
  //播放
  ui->play->setIcon(QIcon(":img/run.png"));
  ui->play->setIconSize(QSize(30,30));
  ui->play->setAutoRaise(true);
  ui->play->setToolTip("Play");//工具栏提示
//    //暂停
//    ui->pause->setIcon(QIcon(":img/pause.png"));
//    ui->pause->setAutoRaise(true);
//    ui->pause->setIconSize(QSize(30,30));
//    ui->pause->setToolTip("Pause");//工具栏提示
  //停止
  ui->stop->setIcon(QIcon(":img/stop.png"));
  ui->stop->setIconSize(QSize(30,30));
  ui->stop->setAutoRaise(true);
  ui->stop->setToolTip("Stop");//工具栏提示
  //后退
  ui->back->setIcon(QIcon(":img/back.png"));
  ui->back->setIconSize(QSize(30,30));
  ui->back->setAutoRaise(true);
  ui->back->setToolTip("Speed Down");//工具栏提示
  //前进
  ui->forward->setIcon(QIcon(":img/forward.png"));
  ui->forward->setIconSize(QSize(30,30));
  ui->forward->setAutoRaise(true);
  ui->forward->setToolTip("Speed Up");//工具栏提示

最后,利用信号和槽将movie的帧改变与滑动条变化进行联系:

    //movie的槽函数
  connect(movie,SIGNAL(frameChanged(int)),this,SLOT(updateFrameSlider()));

然后定义五个按钮的槽函数:

首先是打开按钮槽函数,首先得打开的路径,QFileInfo(fileName).path()将记录第一次打开文件的路径,当打开文件后,movie就开始自动播放,同时将播放按钮图标修改为暂停:

//打开按钮槽函数
void MainWindow::on_open_clicked()
{
  QString fileName=QFileDialog::getOpenFileName(this,"open a file",currentMovieDirectory);
  if(!fileName.isEmpty()){
      currentMovieDirectory=QFileInfo(fileName).path();
      movie->stop();
      ui->movieLabel->setMovie(movie);//将标签内容设置为movie
      movie->setFileName(fileName);//设置文件名
      movie->start();
      //切换成暂停按钮
      ui->play->setIcon(QIcon(":img/pause.png"));
      ui->play->setIconSize(QSize(30,30));
      ui->play->setAutoRaise(true);
      ui->play->setToolTip("Pause");//工具栏提示
      //s改为暂停
      s="暂停";
  }
}

然后是播放/暂停按钮槽函数:

//播放/暂停按钮槽函数
void MainWindow::on_play_clicked()
{

  if(s=="播放"){
      movie->start();
      //切换成暂停按钮
      ui->play->setIcon(QIcon(":img/pause.png"));
      ui->play->setIconSize(QSize(30,30));
      ui->play->setAutoRaise(true);
      ui->play->setToolTip("Pause");//工具栏提示
      //s改为暂停
      s="暂停";


  }
  else if(s=="暂停"){
      movie->setPaused(true);//暂停
      //切换为播放按钮
      ui->play->setIcon(QIcon(":img/run.png"));
      ui->play->setIconSize(QSize(30,30));
      ui->play->setAutoRaise(true);
      ui->play->setToolTip("Play");//工具栏提示
      //s改为播放
      s="播放";
  }
}

然后是停止按钮槽函数:

//停止按钮槽函数
void MainWindow::on_stop_clicked()
{
  movie->stop();
  //如果是暂停,则切换为播放按钮
  if(s=="暂停"){
      //切换为播放按钮
      ui->play->setIcon(QIcon(":img/run.png"));
      ui->play->setIconSize(QSize(30,30));
      ui->play->setAutoRaise(true);
      ui->play->setToolTip("Play");//工具栏提示
      //s改为播放
      s="播放";
  }
  //进度条归位
  ui->frameSlider->setValue(0);
}

减速按钮槽函数和加速按钮槽函数:

//减速
void MainWindow::on_back_clicked()
{
  qint32 currentSpeed=movie->speed();//获取当前速度
  qDebug()<<currentSpeed;
  if(currentSpeed>40){
      movie->setSpeed(currentSpeed-20);
  }
  else{
      movie->setSpeed(20);
  }
}

//加速
void MainWindow::on_forward_clicked()
{
  qint32 currentSpeed=movie->speed();//速度
  qDebug()<<currentSpeed;
  if(currentSpeed<=480){
      movie->setSpeed(currentSpeed+20);
  }
  else{
      movie->setSpeed(500);
  }
}

滑动条变化对应槽函数,用以关联frameSlider和movie:

//滑动进度条
void MainWindow::on_frameSlider_valueChanged(int value)
{
  movie->jumpToFrame(value);//movie跳到指定帧
}

最后是updateFrameSlider()函数,首先设定frameSlider的最大值,如果打开的movie存在,将激活除pause外的所有控件:

void MainWindow::updateFrameSlider()
{
  bool hasFrame=(movie->currentFrameNumber()>=0);

   if(hasFrame)
   {
       if(movie->frameCount()>0)
           ui->frameSlider->setMaximum(movie->frameCount()-1);//设置进度条的最大值为帧数-1
       else
       {
           if(movie->currentFrameNumber()>ui->frameSlider->maximum())
               ui->frameSlider->setMaximum(movie->currentFrameNumber());//设置进度条的最大值为帧数
       }
       ui->frameSlider->setValue(movie->currentFrameNumber());
   }
   else
       ui->frameSlider->setMaximum(0);//设置进度条最小值为0
  //激活所有控件
   ui->frameLabel->setEnabled(hasFrame);
   ui->frameSlider->setEnabled(hasFrame);
   ui->back->setEnabled(hasFrame);
   ui->forward->setEnabled(hasFrame);
   ui->stop->setEnabled(hasFrame);
}

 

五、效果演示

完整效果如下:

基于Qt实现简易GIF播放器的示例代码

到此这篇关于基于Qt实现简易GIF播放器的示例代码的文章就介绍到这了,更多相关Qt GIF播放器内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://wendy.blog.csdn.net/article/details/122144028

延伸 · 阅读

精彩推荐
  • C/C++C++数据结构之堆详解

    C++数据结构之堆详解

    本文详细讲解了C++数据结构之堆,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    CairBin12012022-11-04
  • C/C++Qt地图自适应拉伸的实现示例

    Qt地图自适应拉伸的实现示例

    最近需要写一个程序,要是让qt到程序自适应,本文主要介绍了Qt地图自适应拉伸的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感...

    feiyangqingyun10672022-07-20
  • C/C++用c++实现x的y次幂的代码

    用c++实现x的y次幂的代码

    以下实例是对使用c++实现x的y次幂的解决方法进行了介绍。需要的朋友参考下...

    C++教程网2732020-11-27
  • C/C++MinGW-w64 C/C++编译器下载和安装的方法步骤(入门教程)

    MinGW-w64 C/C++编译器下载和安装的方法步骤(入门教程)

    如果电脑没有安装MinGW-w64 C/C++编译器,就无法运行gcc命令,本文主要介绍了MinGW-w64 C/C++编译器下载和安装的方法步骤,文中通过示例代码介绍的非常详细,...

    SLF8862022-09-28
  • C/C++C++快速排序算法简明理解

    C++快速排序算法简明理解

    快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面...

    m78星云杰克3302022-12-09
  • C/C++利用Matlab绘制好看的旋转九边形

    利用Matlab绘制好看的旋转九边形

    这篇文章主要为大家介绍了如何利用Matlab绘制超好看的旋转九边形。文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下...

    slandarer11682022-10-27
  • C/C++C++ move()函数案例详解

    C++ move()函数案例详解

    这篇文章主要介绍了C++ move()函数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    chengjian1687252021-12-27
  • C/C++C++中求余运算符(%)示例详解

    C++中求余运算符(%)示例详解

    求余运算符“%”,二元运算符,具有左结合性。参与运算的量均为整型。求余运算的结果等于两个数相除后的余数。看似很简单的运算符,却也真要掌握用...

    IT男汉9382021-04-27