欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Qt實現(xiàn)圖片播放器的示例代碼

 更新時間:2022年12月16日 09:40:05   作者:音視頻開發(fā)老舅  
這篇文章主要為大家詳細(xì)介紹了如何使用qt制作了一個簡單的圖片播放器,可以播放gif、png等格式圖片。文中的示例代碼講解詳細(xì),需要的可以參考一下

前言:使用qt制作了一個簡單的圖片播放器,可以播放gif、png等格式圖片

先來看看播放器的功能(當(dāng)然是很簡陋的,沒有很深入的設(shè)計):

1、點擊圖片列表中圖片進(jìn)行播放。

2、自動播放,播放的圖片的間隔時間可以自己設(shè)定,時間的單位是秒。

3、自動播放的時候再點擊圖片列表會停止自動播放,保存當(dāng)前播放的圖片的順序,再次點擊自動播放的時候?qū)漠?dāng)前開始。

4、自動播放到最后一張圖片的時候?qū)V棺詣硬シ?,再次點擊自動播放的時候?qū)牡谝粡垐D片開始。

先上圖看看具體功能:

說完功能我們聊聊制作思路和使用到的主要代碼:

1、打開有圖片的文件,并獲取文件的路徑

Dir = QFileDialog::getExistingDirectory(this);//獲取文件所在的具體路徑

2、把文件的路徑顯示在指定的窗口

ui->photoPath->setText(Dir);//顯示打開的文件的具體路徑

3、列出文件中的圖片的路徑,建立小圖標(biāo),并把圖片路徑保存到容器中,方便自動播放

//列出目錄下的文件
    for(int i=0;i<fileList.count();i++)
    {
        QFileInfo info = fileList.at(i);
        fileDir.clear();
        fileDir.append(Dir + "/"); 
        QString filename = info.fileName();
        fileDir.append(filename);
        photoPath.append(filename);// 把圖片的路徑保存到容器中
 
        if(info.fileName() == "." || info.fileName() == "..") //跳過這兩個目錄
        {
            continue;
        }
        QListWidgetItem *item = new QListWidgetItem(QIcon(fileDir),info.fileName());//建立文件縮小圖標(biāo)
        ui->photoList->addItem(item);//把圖片相對路徑顯示到窗口中
 
      }

4、單擊圖片列表中的圖片進(jìn)行播放(圖片播放的代碼)

tempDir.clear();
 tempDir.append(Dir+"/");
 QString path = ui->photoList->currentItem()->text();
 tempDir.append(path);    
 ui->photoShow->setScaledContents(true);//顯示圖片的全部
 ui->photoShow->setPixmap(QPixmap(tempDir));//顯示圖

5、動態(tài)圖播放

//播放動態(tài)圖
void MainWindow::showDinamicPhoto(QString path)
{
    QMovie *movie = new QMovie(path);  // path圖片路徑
    movie->start(); //開始播放動態(tài)圖
    ui->photoShow->setMovie(movie); //將圖片設(shè)置為為動態(tài)
    ui->photoShow->setScaledContents(true); //盡可能完整的播放整張動圖 ,此處要設(shè)置為true
}

6、自動播放,這里的自動播放我使用了定時器實現(xiàn)

    else if(checked) //啟動定時器
    {
       delayTime = ui->delayEdit->text();
       mtime->start(delayTime.toInt()*1000);//啟動定時器并設(shè)置播放時間間隔
       autoFlag = true;
       ui->autoPhoto->setCheckState(Qt::Unchecked);
    }
    else if(!checked)//停止定時器
    {
        mtime->stop();//停止定時器
        delayTime.clear();
        autoFlag = false;
    }

7、設(shè)置自動播按鈕的狀態(tài)

ui->autoPhoto->setCheckState(Qt::Unchecked); //把按鈕重新置于沒有被選中的狀態(tài)

這里切記要這樣使用,不要用setCheckable()函數(shù),很容易出錯

具體代碼如下:

頭文件mainwindow.h

#ifndef MAINWINDOW_H
 #define MAINWINDOW_H
 
 #include <QMainWindow>
 #include <QFile>
 #include <QDir>
 #include <QTimer>
 #include <QThread>
 namespace Ui {
 class MainWindow;
 }
 
 class MainWindow : public QMainWindow
 {
     Q_OBJECT
 
 public:
     explicit MainWindow(QWidget *parent = 0);
     ~MainWindow();
 
 private slots:
     void on_pathBt_clicked(); //打開目錄
 
     void on_photoList_clicked(const QModelIndex &index);//單擊播放圖片
 
     void on_autoPhoto_clicked(bool checked);//自動播放選擇
     void autoPhoto(); //自動播放函數(shù)
     void showDinamicPhoto(QString path);//動態(tài)圖播放(格式為gif)
 
 private:
     Ui::MainWindow *ui;
     QFile *file;
     QString Dir;//打開文件的路徑
     QString tempDir; //照片的絕地路徑
     QVector<QString> photoPath;//存放照片相對路徑的容器
     QTimer *mtime; //定時器
     QString delayTime; //延時間隔
     bool autoFlag; //判斷是否進(jìn)入的自動播放格式
     int num; //照片張數(shù)
 };
 
 #endif // MAINWINDOW_H

源文件mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QDebug>
#include <QMessageBox>
#include <QMovie>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    autoFlag(false),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    num = 0;
 
    delayTime.clear();
    mtime = new QTimer();
 
    //連接自動播放槽函數(shù)
    connect(mtime,SIGNAL(timeout()),this,SLOT(autoPhoto()));
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_pathBt_clicked()
{
    Dir = QFileDialog::getExistingDirectory(this);//獲取文件所在的具體路徑
    ui->photoPath->setText(Dir);//顯示打開的文件的具體路徑
    QDir dir(Dir);
    QStringList file;
    QFileInfoList fileList = dir.entryInfoList(file,QDir::Files); //獲取目錄下的文件
    QString fileDir; //保存圖片所在的路徑
 
    //列出目錄下的文件
    for(int i=0;i<fileList.count();i++)
    {
        QFileInfo info = fileList.at(i);
        fileDir.clear();
        fileDir.append(Dir + "/");
        QString filename = info.fileName();
        fileDir.append(filename);
        photoPath.append(filename);// 把圖片的路徑裝到容器中
 
        if(info.fileName() == "." || info.fileName() == "..") //跳過這兩個目錄
        {
            continue;
        }
        QListWidgetItem *item = new QListWidgetItem(QIcon(fileDir),info.fileName());//建立文件縮小圖標(biāo)
        ui->photoList->addItem(item);//把圖片相對路徑顯示到窗口中
 
      }
     // qDebug()<<ui->photoList->count();
}
 
 
//單擊圖片列表中的圖片進(jìn)行播放,如果當(dāng)前
void MainWindow::on_photoList_clicked(const QModelIndex &index)
{
 
    //如果選中了自動播放的情況下,點擊列表中的內(nèi)容,則停止自動播放
    if(autoFlag) //選中自動播放的情況
    {
        mtime->stop();
        ui->autoPhoto->setCheckState(Qt::Unchecked);
        autoFlag = false;
    }
 
    num = ui->photoList->row(ui->photoList->currentItem()); //獲取當(dāng)前點擊的內(nèi)容的行號
 
    //在沒有選中自動播放的情況下,判斷當(dāng)前是否點擊了最后一張照片,如果是最后一張照片,在選中自動播放的情況下讓它返回到第一張照片
    if(!autoFlag)
    {
        num == ui->photoList->count();
        num = 0;
    }
    tempDir.clear();
    tempDir.append(Dir+"/");
    QString path = ui->photoList->currentItem()->text();
    tempDir.append(path);
 
    //判斷是否是動態(tài)圖
    if(tempDir.endsWith(".gif") || tempDir.endsWith(".Gif"))
    {
        showDinamicPhoto(tempDir);
    }
    else
    {
        ui->photoShow->setScaledContents(true);//顯示圖片的全部
        ui->photoShow->setPixmap(QPixmap(tempDir));//顯示圖片
    }
 
}
 
 
//自動播放照片
void MainWindow::on_autoPhoto_clicked(bool checked)
{
    if(ui->delayEdit->text().isEmpty())
    {
       QMessageBox::warning(this,"提示","請輸入需要間隔的播放時間(秒)");
       ui->autoPhoto->setCheckState(Qt::Unchecked);
       return;
    }
 
    else if(ui->photoList->count() == 0)
    {
        QMessageBox::warning(this,"警告","還沒有可以播放的圖片");
        ui->autoPhoto->setCheckState(Qt::Unchecked); //把按鈕重新置于沒有被選中的狀態(tài)
        return;
    }
 
    else if(checked) //啟動定時器
    {
       delayTime = ui->delayEdit->text();
       mtime->start(delayTime.toInt()*1000);//啟動定時器并設(shè)置播放時間間隔
       autoFlag = true;
       //ui->autoPhoto->setCheckState(Qt::Unchecked);
    }
 
    else if(!checked)//停止定時器
    {
        mtime->stop();//停止定時器
        delayTime.clear();
        autoFlag = false;
    }
 
}
 
void MainWindow::autoPhoto()
{
        //int tempCount=0;
 
        //tempCount =  photoPath.count();
        tempDir.clear();
        tempDir.append(Dir+"/");
        QString path =  photoPath.at(num); //從容器中找到要播放的照片的相對路徑
        tempDir.append(path); //拼接照片的絕對路徑
 
        if(tempDir.endsWith(".gif")  || tempDir.endsWith(".Gif"))
        {
            showDinamicPhoto(tempDir);
            num++;
        }
 
       else if(!(tempDir.endsWith(".gif")  || tempDir.endsWith(".Gif")))
        {
           ui->photoShow->setScaledContents(true);//顯示圖片的全部
           ui->photoShow->setPixmap(QPixmap(tempDir));//顯示圖片
 
           //判斷自動播放的時候是否播放到了最后一張圖片,如果是則停止自動播放
           if(num ==  (photoPath.count()-1))
           {
               qDebug()<<num;
               mtime->stop();
               num = 0;
               if(autoFlag)
               {
                   autoFlag = false;
               }
               qDebug()<<num;
               ui->autoPhoto->setCheckState(Qt::Unchecked);//把自動播放按鈕置于沒有選擇的狀態(tài)
           }
           if(autoFlag)
           {
               num++;
           }
        }
}
 
 
//播放動態(tài)圖
void MainWindow::showDinamicPhoto(QString path)
{
    QMovie *movie = new QMovie(path);  // path圖片路徑
    movie->start(); //開始播放動態(tài)圖
    ui->photoShow->setMovie(movie); //將圖片設(shè)置為為動態(tài)
    ui->photoShow->setScaledContents(true); //盡可能完整的播放整張動圖 ,此處要設(shè)置為true
}

界面文件mainwindow.ui

View Code

具體界面如下

到此這篇關(guān)于基于Qt實現(xiàn)圖片播放器的示例代碼的文章就介紹到這了,更多相關(guān)Qt圖片播放器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中atof?函數(shù)的介紹

    C++中atof?函數(shù)的介紹

    這篇文章主要給大家分享的是C++中atof?函數(shù)的介紹,在?stdlib.h?中?atof?函數(shù),可用于將?char?字符串轉(zhuǎn)為?float?/?double?浮點數(shù)類型,想具體了解語法的小伙伴可以參考下面文章的內(nèi)容,希望對大家有所幫助
    2021-11-11
  • C++高并發(fā)內(nèi)存池的整體設(shè)計和實現(xiàn)思路

    C++高并發(fā)內(nèi)存池的整體設(shè)計和實現(xiàn)思路

    這篇文章主要介紹了C++高并發(fā)內(nèi)存池的整體設(shè)計和實現(xiàn)思路詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • C語言實現(xiàn)的程序員老黃歷實例

    C語言實現(xiàn)的程序員老黃歷實例

    這篇文章主要介紹了C語言實現(xiàn)的程序員老黃歷,涉及日期的判定及流程控制的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C語言示例講解if else語句的用法

    C語言示例講解if else語句的用法

    這篇文章主要介紹C語言中的If Else語句怎么使用,在日常操作中,相信很多人在If Else語句怎么使用問題上存在疑惑,小編查閱了各式資料,整理出使用方法,接下來,請跟著小編一起來學(xué)習(xí)吧
    2022-06-06
  • C語言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實現(xiàn)

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)旋轉(zhuǎn)鏈表的實現(xiàn)的相關(guān)資料,這里提供實例幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • C++運算符重載與多繼承及二義性詳解

    C++運算符重載與多繼承及二義性詳解

    繼友元知識過后,就到了今天的C++運算符重載的內(nèi)容了,運算符重載是C++里比較重要的內(nèi)容。這篇博文不會一下子講完各種運算符重載,因為太多了了也不好吸收掌握,所以運算符重載我準(zhǔn)備分多次記錄和分享,那么接下來進(jìn)入正文
    2022-11-11
  • C++使用UDP通訊的實現(xiàn)示例

    C++使用UDP通訊的實現(xiàn)示例

    本文實現(xiàn)對C++使用UDP做了簡單封裝,實現(xiàn)通訊,包括服務(wù)端和客戶端,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • 全局變量與局部變量在內(nèi)存中的區(qū)別詳細(xì)解析

    全局變量與局部變量在內(nèi)存中的區(qū)別詳細(xì)解析

    以下是對全局變量與局部變量在內(nèi)存中的區(qū)別進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • 詳解C語言函數(shù)返回值解析

    詳解C語言函數(shù)返回值解析

    這篇文章主要介紹了詳解C語言函數(shù)返回值解析的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++實現(xiàn)簡單掃雷游戲

    C++實現(xiàn)簡單掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論