基于Qt實現簡易GIF播放器的示例代碼
一、項目介紹
利用Qt設計一個簡易GIF播放器,可以播放GIF動畫。其基本功能有載入文件、播放、暫停、停止、快進和快退。
二、項目基本配置
新建一個Qt案例,項目名稱為“GIFTest”,基類選擇“QMainWindow”,創(chuàng)建UI界面復選框的選中狀態(tài),完成項目創(chuàng)建。
三、UI界面設計
UI界面如下:

界面中創(chuàng)建了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,系統(tǒng)會自動生成.qrc文件。點擊.qrc文件,在最下角前綴輸入框將“/new/prefix1”改成“/”,然后點擊添加,添加文件,將幾個png文件選擇添加,然后進行構建(小錘子),此時再點擊.qrc就會看到png文件已經添加進來。
調用QPixmap將圖片添加到button中,設置控件固定大小為30*30,setAutoRaise可以將button的外邊框去除在鼠標滑過該button時會有浮出效果顯示邊框,這個效果比較好看。setToolTip函數可以使鼠標放在控件上時提示該控件可以執(zhí)行的操作,代碼如下:
//打開文件
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播放器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

