<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
利用Qt設計一個簡易GIF播放器,可以播放GIF動畫。其基本功能有載入檔案、播放、暫停、停止、快進和快退。
新建一個Qt案例,專案名稱為“GIFTest”,基礎類別選擇“QMainWindow”,建立UI介面核取方塊的選中狀態,完成專案建立。
UI介面如下:
介面中建立了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 | / |
首先,宣告兩個標頭檔案:
#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="播放";//對播放和暫停按鈕進行切換
首先需要設定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!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45