基于Qt實(shí)現(xiàn)簡(jiǎn)易GIF播放器的示例代碼
一、項(xiàng)目介紹
利用Qt設(shè)計(jì)一個(gè)簡(jiǎn)易GIF播放器,可以播放GIF動(dòng)畫。其基本功能有載入文件、播放、暫停、停止、快進(jìn)和快退。
二、項(xiàng)目基本配置
新建一個(gè)Qt案例,項(xiàng)目名稱為“GIFTest”,基類選擇“QMainWindow”,創(chuàng)建UI界面復(fù)選框的選中狀態(tài),完成項(xiàng)目創(chuàng)建。
三、UI界面設(shè)計(jì)
UI界面如下:
界面中創(chuàng)建了8個(gè)控件,其名稱和類型如下表所示:
序號(hào) | 名稱 | 類型 | 屬性 |
---|---|---|---|
① | 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 | / |
四、主程序?qū)崿F(xiàn)
4.1 mainwindow.h頭文件
首先,聲明兩個(gè)頭文件:
#include<QFileDialog> #include<QMovie>
然后聲明若干個(gè)槽函數(shù):
private slots: void on_open_clicked(); void on_play_clicked(); void on_stop_clicked(); void on_back_clicked(); void on_frameSlider_valueChanged(int value);//進(jìn)度條改變槽函數(shù) void on_forward_clicked(); void updateFrameSlider();//movie的進(jìn)度條更新槽函數(shù)
聲明三個(gè)私有變量:
private: QString currentMovieDirectory;//當(dāng)前路徑 QMovie *movie; QString s="播放";//對(duì)播放和暫停按鈕進(jìn)行切換
4.2 mainwindow.cpp源文件
首先需要設(shè)置movie的緩存模式,這里我們要求當(dāng)文件播放一遍后返回重新播放,所以使用CacheAll模式:
//新建movie movie =new QMovie(this); movie->setCacheMode(QMovie::CacheAll);//設(shè)置movie的緩存模式
然后設(shè)置movieLabel的背景顏色為Dark:
ui->movieLabel->setBackgroundRole(QPalette::Dark); ui->movieLabel->setAutoFillBackground(true);//自動(dòng)填充背景
首先要把圖標(biāo)文件xxx.png添加到生成的.pro根目錄中去,然后右擊movie,添加新文件,Qt資源文件,定位到根文件夾,命名為button,系統(tǒng)會(huì)自動(dòng)生成.qrc文件。點(diǎn)擊.qrc文件,在最下角前綴輸入框?qū)?ldquo;/new/prefix1”改成“/”,然后點(diǎn)擊添加,添加文件,將幾個(gè)png文件選擇添加,然后進(jìn)行構(gòu)建(小錘子),此時(shí)再點(diǎn)擊.qrc就會(huì)看到png文件已經(jīng)添加進(jìn)來。
調(diào)用QPixmap將圖片添加到button中,設(shè)置控件固定大小為30*30,setAutoRaise可以將button的外邊框去除在鼠標(biāo)滑過該button時(shí)會(huì)有浮出效果顯示邊框,這個(gè)效果比較好看。setToolTip函數(shù)可以使鼠標(biāo)放在控件上時(shí)提示該控件可以執(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");//工具欄提示 //前進(jìn) ui->forward->setIcon(QIcon(":img/forward.png")); ui->forward->setIconSize(QSize(30,30)); ui->forward->setAutoRaise(true); ui->forward->setToolTip("Speed Up");//工具欄提示
最后,利用信號(hào)和槽將movie的幀改變與滑動(dòng)條變化進(jìn)行聯(lián)系:
//movie的槽函數(shù) connect(movie,SIGNAL(frameChanged(int)),this,SLOT(updateFrameSlider()));
然后定義五個(gè)按鈕的槽函數(shù):
首先是打開按鈕槽函數(shù),首先得打開的路徑,QFileInfo(fileName).path()將記錄第一次打開文件的路徑,當(dāng)打開文件后,movie就開始自動(dòng)播放,同時(shí)將播放按鈕圖標(biāo)修改為暫停:
//打開按鈕槽函數(shù) 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);//將標(biāo)簽內(nèi)容設(shè)置為movie movie->setFileName(fileName);//設(shè)置文件名 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="暫停"; } }
然后是播放/暫停按鈕槽函數(shù):
//播放/暫停按鈕槽函數(shù) 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="播放"; } }
然后是停止按鈕槽函數(shù):
//停止按鈕槽函數(shù) 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="播放"; } //進(jìn)度條歸位 ui->frameSlider->setValue(0); }
減速按鈕槽函數(shù)和加速按鈕槽函數(shù):
//減速 void MainWindow::on_back_clicked() { qint32 currentSpeed=movie->speed();//獲取當(dāng)前速度 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); } }
滑動(dòng)條變化對(duì)應(yīng)槽函數(shù),用以關(guān)聯(lián)frameSlider和movie:
//滑動(dòng)進(jìn)度條 void MainWindow::on_frameSlider_valueChanged(int value) { movie->jumpToFrame(value);//movie跳到指定幀 }
最后是updateFrameSlider()函數(shù),首先設(shè)定frameSlider的最大值,如果打開的movie存在,將激活除pause外的所有控件:
void MainWindow::updateFrameSlider() { bool hasFrame=(movie->currentFrameNumber()>=0); if(hasFrame) { if(movie->frameCount()>0) ui->frameSlider->setMaximum(movie->frameCount()-1);//設(shè)置進(jìn)度條的最大值為幀數(shù)-1 else { if(movie->currentFrameNumber()>ui->frameSlider->maximum()) ui->frameSlider->setMaximum(movie->currentFrameNumber());//設(shè)置進(jìn)度條的最大值為幀數(shù) } ui->frameSlider->setValue(movie->currentFrameNumber()); } else ui->frameSlider->setMaximum(0);//設(shè)置進(jìn)度條最小值為0 //激活所有控件 ui->frameLabel->setEnabled(hasFrame); ui->frameSlider->setEnabled(hasFrame); ui->back->setEnabled(hasFrame); ui->forward->setEnabled(hasFrame); ui->stop->setEnabled(hasFrame); }
五、效果演示
完整效果如下:
到此這篇關(guān)于基于Qt實(shí)現(xiàn)簡(jiǎn)易GIF播放器的示例代碼的文章就介紹到這了,更多相關(guān)Qt GIF播放器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ String部分成員模擬實(shí)現(xiàn)流程詳解
我們先不直接實(shí)現(xiàn)完整版的string,先實(shí)現(xiàn)簡(jiǎn)易版的string部分成員來基本了解下它的框架,以及以后來學(xué)習(xí)深淺拷貝的問題。這樣有循序漸進(jìn)的過程嘛2022-08-08在C語(yǔ)言中g(shù)etchar的使用方法和讀取規(guī)則講解
getchar中文意思是獲取字符,getchar函數(shù)從標(biāo)準(zhǔn)輸入輸出里讀取下一個(gè)字符,返回類型為int整形,返回用戶輸入的ASCII碼值,如果到達(dá)文件末尾或者出錯(cuò)返回EOF,這篇文章主要介紹了在C語(yǔ)言中g(shù)etchar的使用方法和讀取規(guī)則,需要的朋友可以參考下2022-12-12C++ OpenCV實(shí)現(xiàn)圖像去水印功能
本文將介紹如何使用OpenCV C++ 進(jìn)行簡(jiǎn)單圖像水印去除。我們?cè)诰W(wǎng)上download圖片時(shí),經(jīng)常因?yàn)榘鏅?quán)問題有水印。本案例通過編寫算法進(jìn)行簡(jiǎn)單水印去除。需要的可以參考一下2022-01-01一文讓你不再害怕指針之C指針詳解(經(jīng)典,非常詳細(xì))
這篇文章主要給大家介紹了C指針的相關(guān)資料,文中介紹的很經(jīng)典,非常詳細(xì),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C指針具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08詳解C語(yǔ)言編程中的函數(shù)指針以及函數(shù)回調(diào)
這篇文章主要介紹了C語(yǔ)言編程中的函數(shù)指針以及函數(shù)回調(diào),函數(shù)回調(diào)實(shí)際上就是讓函數(shù)指針作函數(shù)參數(shù)、調(diào)用時(shí)傳入函數(shù)地址,需要的朋友可以參考下2016-04-04