首頁 > 軟體

基於Qt實現簡易GIF播放器的範例程式碼

2022-06-16 18:05:14

一、專案介紹

利用Qt設計一個簡易GIF播放器,可以播放GIF動畫。其基本功能有載入檔案、播放、暫停、停止、快進和快退。

二、專案基本設定

新建一個Qt案例,專案名稱為“GIFTest”,基礎類別選擇“QMainWindow”,建立UI介面核取方塊的選中狀態,完成專案建立。

三、UI介面設計

UI介面如下:

介面中建立了8個控制元件,其名稱和型別如下表所示:

序號名稱型別屬性
movieLabelQLabeltext:No movie loaded;
alignment:AlignCenter;
SizePolicy:Expanding;
frameLabelQLabeltext:Current frame;
HorizontalSlider QSlidertickInterval:1
openQToolButton/
backQToolButton/
playQToolButton/
forwardQToolButton/
stopQToolButton/

四、主程式實現

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播放器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com