最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Qt實現(xiàn)簡易GIF播放器的示例代碼

 更新時間:2022年06月16日 14:43:35   作者:wendy_ya  
這篇文章主要介紹了如何利用Qt設計一個簡易GIF播放器,可以播放GIF動畫。其基本功能有載入文件、播放、暫停、停止、快進和快退,感興趣的可以了解一下

一、項目介紹

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

二、項目基本配置

新建一個Qt案例,項目名稱為“GIFTest”,基類選擇“QMainWindow”,創(chuàng)建UI界面復選框的選中狀態(tài),完成項目創(chuàng)建。

三、UI界面設計

UI界面如下:

界面中創(chuàng)建了8個控件,其名稱和類型如下表所示:

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

四、主程序實現(xiàn)

4.1 mainwindow.h頭文件

首先,聲明兩個頭文件:

#include<QFileDialog>
#include<QMovie>

然后聲明若干個槽函數(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);//進度條改變槽函數(shù)
    void on_forward_clicked();
    void updateFrameSlider();//movie的進度條更新槽函數(shù)

聲明三個私有變量:

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函數(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");//工具欄提示
    //前進
    ui->forward->setIcon(QIcon(":img/forward.png"));
    ui->forward->setIconSize(QSize(30,30));
    ui->forward->setAutoRaise(true);
    ui->forward->setToolTip("Speed Up");//工具欄提示

最后,利用信號和槽將movie的幀改變與滑動條變化進行聯(lián)系:

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

然后定義五個按鈕的槽函數(shù):

首先是打開按鈕槽函數(shù),首先得打開的路徑,QFileInfo(fileName).path()將記錄第一次打開文件的路徑,當打開文件后,movie就開始自動播放,同時將播放按鈕圖標修改為暫停:

//打開按鈕槽函數(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);//將標簽內容設置為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="暫停";
    }
}

然后是播放/暫停按鈕槽函數(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="播放";
    }
    //進度條歸位
    ui->frameSlider->setValue(0);
}

減速按鈕槽函數(shù)和加速按鈕槽函數(shù):

//減速
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);
    }
}

滑動條變化對應槽函數(shù),用以關聯(lián)frameSlider和movie:

//滑動進度條
void MainWindow::on_frameSlider_valueChanged(int value)
{
    movie->jumpToFrame(value);//movie跳到指定幀
}

最后是updateFrameSlider()函數(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ù)-1
         else
         {
             if(movie->currentFrameNumber()>ui->frameSlider->maximum())
                 ui->frameSlider->setMaximum(movie->currentFrameNumber());//設置進度條的最大值為幀數(shù)
         }
         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實現(xiàn)簡易GIF播放器的示例代碼的文章就介紹到這了,更多相關Qt GIF播放器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 不要被C++(自動生成規(guī)則)所蒙騙

    不要被C++(自動生成規(guī)則)所蒙騙

    正如標題所說,我們不要被C++語法中所描述的那些條條框框所“蒙騙”了。的確,相信這些生成規(guī)則不會對我們的編程帶來多大的影響(不會產生錯誤),但是只有了解它們的背后操作,我們才知道編譯器究竟為我們做了什么,感興趣的朋友可以了解下,希望本文對你有所幫助
    2013-01-01
  • C語言代碼實現(xiàn)推箱子小游戲

    C語言代碼實現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細介紹了C語言代碼實現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • openCV4.1.1+VS2019環(huán)境配置詳解

    openCV4.1.1+VS2019環(huán)境配置詳解

    這篇文章主要介紹了openCV4.1.1+VS2019環(huán)境配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 深入C++ 函數(shù)映射的使用詳解

    深入C++ 函數(shù)映射的使用詳解

    我比較喜歡用代碼結合實際來講解,下面我將以一段事例代碼來講解如何使用這幾種映射
    2013-07-07
  • C++實現(xiàn)反轉鏈表的兩種方法

    C++實現(xiàn)反轉鏈表的兩種方法

    本文主要介紹了C++實現(xiàn)反轉鏈表的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • 淺析C++中的函數(shù)與指針

    淺析C++中的函數(shù)與指針

    這篇文章主要介紹了淺析C++中的函數(shù)與指針,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • Qt 智能指針QScopedPoint用法小結

    Qt 智能指針QScopedPoint用法小結

    智能指針是C++11引入的一種指針封裝類型,用于自動管理動態(tài)分配的內存,本文主要介紹了Qt 智能指針QScopedPoint用法小結,感興趣的可以了解一下
    2024-01-01
  • 用C語言實現(xiàn)簡單的計算器功能

    用C語言實現(xiàn)簡單的計算器功能

    這篇文章主要為大家詳細介紹了用C語言實現(xiàn)簡單的計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++如何向Lambda傳遞參數(shù)與捕獲

    C++如何向Lambda傳遞參數(shù)與捕獲

    文章介紹了C++中向Lambda表達式傳遞參數(shù)和使用捕獲列表的基本規(guī)則和示例,參數(shù)傳遞要求嚴格匹配類型和數(shù)量,而捕獲列表允許Lambda訪問外部變量,并可以按值或引用捕獲,文章還討論了捕獲的陷阱和解決方案,以及參數(shù)傳遞與捕獲列表的區(qū)別和應用場景,感興趣的朋友一起看看吧
    2025-03-03
  • C++超詳細分析優(yōu)化排序算法之堆排序

    C++超詳細分析優(yōu)化排序算法之堆排序

    堆是計算機科學中一類特殊的數(shù)據(jù)結構的統(tǒng)稱,通常是一個可以被看做一棵完全二叉樹的數(shù)組對象。而堆排序是利用堆這種數(shù)據(jù)結構所設計的一種排序算法。本文將通過圖片詳細介紹堆排序,需要的可以參考一下
    2023-02-02

最新評論

阿城市| 南宫市| 石屏县| 社旗县| 眉山市| 静安区| 周宁县| 随州市| 青神县| 永仁县| 商洛市| 原平市| 博客| 鹤山市| 白沙| 和平区| 湖州市| 泰来县| 汉沽区| 湟中县| 西贡区| 六枝特区| 彰化县| 乃东县| 璧山县| 茶陵县| 图们市| 盘山县| 阿勒泰市| 东乡族自治县| 溧水县| 肥乡县| 仁化县| 鄂托克前旗| 嘉祥县| 清水河县| 板桥市| 沅江市| 阜新| 四会市| 喀什市|