基于Qt实现图片播放器的示例代码

 更新时间:2022年12月16日 09:40:05   作者:音视频开发老舅  
这篇文章主要为大家详细介绍了如何使用qt制作了一个简单的图片播放器,可以播放gif、png等格式图片。文中的示例代码讲解详细,需要的可以参考一下

前言:使用qt制作了一个简单的图片播放器,可以播放gif、png等格式图片

先来看看播放器的功能(当然是很简陋的,没有很深入的设计):

1、点击图片列表中图片进行播放。

2、自动播放,播放的图片的间隔时间可以自己设定,时间的单位是秒。

3、自动播放的时候再点击图片列表会停止自动播放,保存当前播放的图片的顺序,再次点击自动播放的时候将从当前开始。

4、自动播放到最后一张图片的时候将会停止自动播放,再次点击自动播放的时候将会从第一张图片开始。

先上图看看具体功能:

说完功能我们聊聊制作思路和使用到的主要代码:

1、打开有图片的文件,并获取文件的路径

Dir = QFileDialog::getExistingDirectory(this);//获取文件所在的具体路径

2、把文件的路径显示在指定的窗口

ui->photoPath->setText(Dir);//显示打开的文件的具体路径

3、列出文件中的图片的路径,建立小图标,并把图片路径保存到容器中,方便自动播放

//列出目录下的文件
    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());//建立文件缩小图标
        ui->photoList->addItem(item);//把图片相对路径显示到窗口中
 
      }

4、单击图片列表中的图片进行播放(图片播放的代码)

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

5、动态图播放

//播放动态图
void MainWindow::showDinamicPhoto(QString path)
{
    QMovie *movie = new QMovie(path);  // path图片路径
    movie->start(); //开始播放动态图
    ui->photoShow->setMovie(movie); //将图片设置为为动态
    ui->photoShow->setScaledContents(true); //尽可能完整的播放整张动图 ,此处要设置为true
}

6、自动播放,这里的自动播放我使用了定时器实现

    else if(checked) //启动定时器
    {
       delayTime = ui->delayEdit->text();
       mtime->start(delayTime.toInt()*1000);//启动定时器并设置播放时间间隔
       autoFlag = true;
       ui->autoPhoto->setCheckState(Qt::Unchecked);
    }
    else if(!checked)//停止定时器
    {
        mtime->stop();//停止定时器
        delayTime.clear();
        autoFlag = false;
    }

7、设置自动播按钮的状态

ui->autoPhoto->setCheckState(Qt::Unchecked); //把按钮重新置于没有被选中的状态

这里切记要这样使用,不要用setCheckable()函数,很容易出错

具体代码如下:

头文件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(); //自动播放函数
     void showDinamicPhoto(QString path);//动态图播放(格式为gif)
 
 private:
     Ui::MainWindow *ui;
     QFile *file;
     QString Dir;//打开文件的路径
     QString tempDir; //照片的绝地路径
     QVector<QString> photoPath;//存放照片相对路径的容器
     QTimer *mtime; //定时器
     QString delayTime; //延时间隔
     bool autoFlag; //判断是否进入的自动播放格式
     int num; //照片张数
 };
 
 #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();
 
    //连接自动播放槽函数
    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());//建立文件缩小图标
        ui->photoList->addItem(item);//把图片相对路径显示到窗口中
 
      }
     // qDebug()<<ui->photoList->count();
}
 
 
//单击图片列表中的图片进行播放,如果当前
void MainWindow::on_photoList_clicked(const QModelIndex &index)
{
 
    //如果选中了自动播放的情况下,点击列表中的内容,则停止自动播放
    if(autoFlag) //选中自动播放的情况
    {
        mtime->stop();
        ui->autoPhoto->setCheckState(Qt::Unchecked);
        autoFlag = false;
    }
 
    num = ui->photoList->row(ui->photoList->currentItem()); //获取当前点击的内容的行号
 
    //在没有选中自动播放的情况下,判断当前是否点击了最后一张照片,如果是最后一张照片,在选中自动播放的情况下让它返回到第一张照片
    if(!autoFlag)
    {
        num == ui->photoList->count();
        num = 0;
    }
    tempDir.clear();
    tempDir.append(Dir+"/");
    QString path = ui->photoList->currentItem()->text();
    tempDir.append(path);
 
    //判断是否是动态图
    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); //把按钮重新置于没有被选中的状态
        return;
    }
 
    else if(checked) //启动定时器
    {
       delayTime = ui->delayEdit->text();
       mtime->start(delayTime.toInt()*1000);//启动定时器并设置播放时间间隔
       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);//把自动播放按钮置于没有选择的状态
           }
           if(autoFlag)
           {
               num++;
           }
        }
}
 
 
//播放动态图
void MainWindow::showDinamicPhoto(QString path)
{
    QMovie *movie = new QMovie(path);  // path图片路径
    movie->start(); //开始播放动态图
    ui->photoShow->setMovie(movie); //将图片设置为为动态
    ui->photoShow->setScaledContents(true); //尽可能完整的播放整张动图 ,此处要设置为true
}

界面文件mainwindow.ui

View Code

具体界面如下

到此这篇关于基于Qt实现图片播放器的示例代码的文章就介绍到这了,更多相关Qt图片播放器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vc中float与DWORD的互想转换实现代码

    vc中float与DWORD的互想转换实现代码

    这篇文章主要介绍了vc中float与DWORD的互想转换实现代码,需要的朋友可以参考下
    2017-06-06
  • C语言实现统计一行字符串的单词个数

    C语言实现统计一行字符串的单词个数

    这篇文章主要介绍了C语言实现统计一行字符串的单词个数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C++使用ZLIB库实现目录压缩与解压功能

    C++使用ZLIB库实现目录压缩与解压功能

    在软件开发和数据处理中,对数据进行高效的压缩和解压缩是一项重要的任务,这不仅有助于减小数据在网络传输和存储中的占用空间,还能提高系统的性能和响应速度,本文将介绍如何使用 zlib 库进行数据的压缩和解压缩,以及如何保存和读取压缩后的文件
    2025-02-02
  • C语言编程C++自定义个性化类型

    C语言编程C++自定义个性化类型

    这篇文章主要介绍了C语言编程中如何来自定义C++个性化类型,文中附含详细的示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • Qt读取Json文件的方法详解(含源码+注释)

    Qt读取Json文件的方法详解(含源码+注释)

    QT本身就有读取json的接口,简单又方便,下面这篇文章主要给大家介绍了关于Qt读取Json文件(含源码+注释)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • C语言关键字union的定义和使用详解

    C语言关键字union的定义和使用详解

    这篇文章主要介绍了C语言关键字union的定义和使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • C/C++仿华容道小游戏

    C/C++仿华容道小游戏

    这篇文章主要介绍了C/C++仿华容道小游戏的相关资料,模仿实现华容道游戏,感兴趣的朋友可以参考一下
    2016-02-02
  • 简要解读C++的动态和静态关联以及虚析构函数

    简要解读C++的动态和静态关联以及虚析构函数

    这篇文章主要介绍了简要解读C++的动态和静态关联以及虚析构函数,析构函数在C++编程中平时并不是太常用,需要的朋友可以参考下
    2015-09-09
  • CLion搭建配置C++开发环境的图文教程 (MinGW-W64 GCC-8.1.0)

    CLion搭建配置C++开发环境的图文教程 (MinGW-W64 GCC-8.1.0)

    这篇文章主要介绍了CLion搭建配置C++开发环境的教程 (MinGW-W64 GCC-8.1.0),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • C语言数据结构实现字符串分割的实例

    C语言数据结构实现字符串分割的实例

    这篇文章主要介绍了C语言数据结构实现字符串分割的实例的相关资料,希望通过本文能帮助到大家实现这样的功能,需要的朋友可以参考下
    2017-10-10

最新评论