QT制作一个图片播放器

前言:使用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

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3
 4 #include <QMainWindow>
 5 #include <QFile>
 6 #include <QDir>
 7 #include <QTimer>
 8 #include <QThread>
 9 namespace Ui {
10 class MainWindow;
11 }
12
13 class MainWindow : public QMainWindow
14 {
15     Q_OBJECT
16
17 public:
18     explicit MainWindow(QWidget *parent = 0);
19     ~MainWindow();
20
21 private slots:
22     void on_pathBt_clicked(); //打开目录
23
24     void on_photoList_clicked(const QModelIndex &index);//单击播放图片
25
26     void on_autoPhoto_clicked(bool checked);//自动播放选择
27     void autoPhoto(); //自动播放函数
28     void showDinamicPhoto(QString path);//动态图播放(格式为gif)
29
30 private:
31     Ui::MainWindow *ui;
32     QFile *file;
33     QString Dir;//打开文件的路径
34     QString tempDir; //照片的绝地路径
35     QVector<QString> photoPath;//存放照片相对路径的容器
36     QTimer *mtime; //定时器
37     QString delayTime; //延时间隔
38     bool autoFlag; //判断是否进入的自动播放格式
39     int num; //照片张数
40 };
41
42 #endif // MAINWINDOW_H

源文件mainwindow.cpp

  1 #include "mainwindow.h"
  2 #include "ui_mainwindow.h"
  3 #include <QFileDialog>
  4 #include <QDebug>
  5 #include <QMessageBox>
  6 #include <QMovie>
  7
  8 MainWindow::MainWindow(QWidget *parent) :
  9     QMainWindow(parent),
 10     autoFlag(false),
 11     ui(new Ui::MainWindow)
 12 {
 13     ui->setupUi(this);
 14     num = 0;
 15
 16     delayTime.clear();
 17     mtime = new QTimer();
 18
 19     //连接自动播放槽函数
 20     connect(mtime,SIGNAL(timeout()),this,SLOT(autoPhoto()));
 21 }
 22
 23 MainWindow::~MainWindow()
 24 {
 25     delete ui;
 26 }
 27
 28 void MainWindow::on_pathBt_clicked()
 29 {
 30     Dir = QFileDialog::getExistingDirectory(this);//获取文件所在的具体路径
 31     ui->photoPath->setText(Dir);//显示打开的文件的具体路径
 32     QDir dir(Dir);
 33     QStringList file;
 34     QFileInfoList fileList = dir.entryInfoList(file,QDir::Files); //获取目录下的文件
 35     QString fileDir; //保存图片所在的路径
 36
 37     //列出目录下的文件
 38     for(int i=0;i<fileList.count();i++)
 39     {
 40         QFileInfo info = fileList.at(i);
 41         fileDir.clear();
 42         fileDir.append(Dir + "/");
 43         QString filename = info.fileName();
 44         fileDir.append(filename);
 45         photoPath.append(filename);// 把图片的路径装到容器中
 46
 47         if(info.fileName() == "." || info.fileName() == "..") //跳过这两个目录
 48         {
 49             continue;
 50         }
 51         QListWidgetItem *item = new QListWidgetItem(QIcon(fileDir),info.fileName());//建立文件缩小图标
 52         ui->photoList->addItem(item);//把图片相对路径显示到窗口中
 53
 54       }
 55      // qDebug()<<ui->photoList->count();
 56 }
 57
 58
 59 //单击图片列表中的图片进行播放,如果当前
 60 void MainWindow::on_photoList_clicked(const QModelIndex &index)
 61 {
 62
 63     //如果选中了自动播放的情况下,点击列表中的内容,则停止自动播放
 64     if(autoFlag) //选中自动播放的情况
 65     {
 66         mtime->stop();
 67         ui->autoPhoto->setCheckState(Qt::Unchecked);
 68         autoFlag = false;
 69     }
 70
 71     num = ui->photoList->row(ui->photoList->currentItem()); //获取当前点击的内容的行号
 72
 73     //在没有选中自动播放的情况下,判断当前是否点击了最后一张照片,如果是最后一张照片,在选中自动播放的情况下让它返回到第一张照片
 74     if(!autoFlag)
 75     {
 76         num == ui->photoList->count();
 77         num = 0;
 78     }
 79     tempDir.clear();
 80     tempDir.append(Dir+"/");
 81     QString path = ui->photoList->currentItem()->text();
 82     tempDir.append(path);
 83
 84     //判断是否是动态图
 85     if(tempDir.endsWith(".gif") || tempDir.endsWith(".Gif"))
 86     {
 87         showDinamicPhoto(tempDir);
 88     }
 89     else
 90     {
 91         ui->photoShow->setScaledContents(true);//显示图片的全部
 92         ui->photoShow->setPixmap(QPixmap(tempDir));//显示图片
 93     }
 94
 95 }
 96
 97
 98 //自动播放照片
 99 void MainWindow::on_autoPhoto_clicked(bool checked)
100 {
101     if(ui->delayEdit->text().isEmpty())
102     {
103        QMessageBox::warning(this,"提示","请输入需要间隔的播放时间(秒)");
104        ui->autoPhoto->setCheckState(Qt::Unchecked);
105        return;
106     }
107
108     else if(ui->photoList->count() == 0)
109     {
110         QMessageBox::warning(this,"警告","还没有可以播放的图片");
111         ui->autoPhoto->setCheckState(Qt::Unchecked); //把按钮重新置于没有被选中的状态
112         return;
113     }
114
115     else if(checked) //启动定时器
116     {
117        delayTime = ui->delayEdit->text();
118        mtime->start(delayTime.toInt()*1000);//启动定时器并设置播放时间间隔
119        autoFlag = true;
120        ui->autoPhoto->setCheckState(Qt::Unchecked);
121     }
122     else if(!checked)//停止定时器
123     {
124         mtime->stop();//停止定时器
125         delayTime.clear();
126         autoFlag = false;
127     }
128 }
129
130 void MainWindow::autoPhoto()
131 {
132
133         tempDir.clear();
134         tempDir.append(Dir+"/");
135         QString path =  photoPath.at(num); //从容器中找到要播放的照片的相对路径
136         tempDir.append(path); //拼接照片的绝对路径
137
138         if(tempDir.endsWith(".gif")  || tempDir.endsWith(".Gif"))
139         {
140             showDinamicPhoto(tempDir);
141             num++;
142         }
143
144        else if(!(tempDir.endsWith(".gif")  || tempDir.endsWith(".Gif")))
145         {
146            ui->photoShow->setScaledContents(true);//显示图片的全部
147            ui->photoShow->setPixmap(QPixmap(tempDir));//显示图片
148            num++;
149         }
150
151         //判断自动播放的时候是否播放到了最后一张图片,如果是则停止自动播放
152         else if(num == photoPath.count())
153         {
154             mtime->stop();
155             num = 0;
156             if(autoFlag)
157             {
158                 autoFlag = false;
159             }
160             ui->autoPhoto->setCheckState(Qt::Unchecked);//把自动播放按钮置于没有选择的状态
161         }
162 }
163
164
165 //播放动态图
166 void MainWindow::showDinamicPhoto(QString path)
167 {
168     QMovie *movie = new QMovie(path);  // path图片路径
169     movie->start(); //开始播放动态图
170     ui->photoShow->setMovie(movie); //将图片设置为为动态
171     ui->photoShow->setScaledContents(true); //尽可能完整的播放整张动图 ,此处要设置为true
172 }

界面文件mainwindow.ui

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <ui version="4.0">
  3  <class>MainWindow</class>
  4  <widget class="QMainWindow" name="MainWindow">
  5   <property name="geometry">
  6    <rect>
  7     <x>0</x>
  8     <y>0</y>
  9     <width>702</width>
 10     <height>800</height>
 11    </rect>
 12   </property>
 13   <property name="windowTitle">
 14    <string>MainWindow</string>
 15   </property>
 16   <widget class="QWidget" name="centralWidget">
 17    <widget class="QWidget" name="layoutWidget">
 18     <property name="geometry">
 19      <rect>
 20       <x>10</x>
 21       <y>10</y>
 22       <width>456</width>
 23       <height>49</height>
 24      </rect>
 25     </property>
 26     <layout class="QHBoxLayout" name="horizontalLayout_5">
 27      <item>
 28       <layout class="QVBoxLayout" name="verticalLayout">
 29        <property name="spacing">
 30         <number>0</number>
 31        </property>
 32        <property name="bottomMargin">
 33         <number>0</number>
 34        </property>
 35        <item>
 36         <widget class="QTextBrowser" name="photoPath">
 37          <property name="maximumSize">
 38           <size>
 39            <width>150</width>
 40            <height>20</height>
 41           </size>
 42          </property>
 43         </widget>
 44        </item>
 45        <item>
 46         <layout class="QHBoxLayout" name="horizontalLayout_2">
 47          <item>
 48           <widget class="QPushButton" name="pathBt">
 49            <property name="text">
 50             <string>浏览</string>
 51            </property>
 52           </widget>
 53          </item>
 54          <item>
 55           <spacer name="horizontalSpacer_3">
 56            <property name="orientation">
 57             <enum>Qt::Horizontal</enum>
 58            </property>
 59            <property name="sizeHint" stdset="0">
 60             <size>
 61              <width>40</width>
 62              <height>20</height>
 63             </size>
 64            </property>
 65           </spacer>
 66          </item>
 67         </layout>
 68        </item>
 69       </layout>
 70      </item>
 71      <item>
 72       <layout class="QHBoxLayout" name="horizontalLayout_3">
 73        <property name="spacing">
 74         <number>0</number>
 75        </property>
 76        <item>
 77         <spacer name="horizontalSpacer">
 78          <property name="orientation">
 79           <enum>Qt::Horizontal</enum>
 80          </property>
 81          <property name="sizeHint" stdset="0">
 82           <size>
 83            <width>40</width>
 84            <height>20</height>
 85           </size>
 86          </property>
 87         </spacer>
 88        </item>
 89        <item>
 90         <layout class="QHBoxLayout" name="horizontalLayout">
 91          <item>
 92           <widget class="QLineEdit" name="delayEdit">
 93            <property name="maximumSize">
 94             <size>
 95              <width>95</width>
 96              <height>16777215</height>
 97             </size>
 98            </property>
 99            <property name="placeholderText">
100             <string>间隔时间(秒)</string>
101            </property>
102           </widget>
103          </item>
104          <item>
105           <widget class="QCheckBox" name="autoPhoto">
106            <property name="text">
107             <string>自动播放</string>
108            </property>
109           </widget>
110          </item>
111         </layout>
112        </item>
113        <item>
114         <spacer name="horizontalSpacer_2">
115          <property name="orientation">
116           <enum>Qt::Horizontal</enum>
117          </property>
118          <property name="sizeHint" stdset="0">
119           <size>
120            <width>40</width>
121            <height>20</height>
122           </size>
123          </property>
124         </spacer>
125        </item>
126        <item>
127         <spacer name="horizontalSpacer_4">
128          <property name="orientation">
129           <enum>Qt::Horizontal</enum>
130          </property>
131          <property name="sizeHint" stdset="0">
132           <size>
133            <width>40</width>
134            <height>20</height>
135           </size>
136          </property>
137         </spacer>
138        </item>
139       </layout>
140      </item>
141     </layout>
142    </widget>
143    <widget class="QWidget" name="layoutWidget">
144     <property name="geometry">
145      <rect>
146       <x>12</x>
147       <y>62</y>
148       <width>681</width>
149       <height>461</height>
150      </rect>
151     </property>
152     <layout class="QHBoxLayout" name="horizontalLayout_4">
153      <item>
154       <widget class="QListWidget" name="photoList">
155        <property name="sizePolicy">
156         <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
157          <horstretch>0</horstretch>
158          <verstretch>0</verstretch>
159         </sizepolicy>
160        </property>
161        <property name="maximumSize">
162         <size>
163          <width>120</width>
164          <height>400</height>
165         </size>
166        </property>
167        <property name="sizeIncrement">
168         <size>
169          <width>0</width>
170          <height>0</height>
171         </size>
172        </property>
173        <property name="baseSize">
174         <size>
175          <width>2</width>
176          <height>0</height>
177         </size>
178        </property>
179       </widget>
180      </item>
181      <item>
182       <widget class="QLabel" name="photoShow">
183        <property name="maximumSize">
184         <size>
185          <width>16777215</width>
186          <height>800</height>
187         </size>
188        </property>
189        <property name="text">
190         <string/>
191        </property>
192       </widget>
193      </item>
194     </layout>
195    </widget>
196   </widget>
197   <widget class="QStatusBar" name="statusBar"/>
198  </widget>
199  <layoutdefault spacing="6" margin="11"/>
200  <resources/>
201  <connections/>
202 </ui>

具体界面如下

时间: 2024-10-07 12:03:18

QT制作一个图片播放器的相关文章

一个图片装饰器的制作

一个图片装饰器的制作一1 首先创建工程picDecor,2 然后从对象库中,拉出Round Rect按钮到视图中,3 为了显示用户所选择的图片,需要往视图里, 添加view Controller对象,如下图4 还要一个图片视图imageView来编辑一张图片和一个windows and Bars工具栏来放置按钮,(备注:要先添加工具栏再添加iamgeView对像)5 再添加flexible space bar Button Item到工具栏中心,然后再添加一个bar buttonItem到工具栏

用OpenCV制作视频控制播放器(无声音)

申明:OpenCV是计算机视觉库,所以用在图片或视频处理上,故播放的视频暂时没有声音 软件:用OpenCV制作视频控制播放器(无声音) 功能说明:新建播放窗口,添加进度条可以拖动视频播放. 流程图: 功能说明: 1. 新建进度条 cvCreatTrackbar("","",&,frames,callback) 2.获取总帧数 cvGetCaptureProperty(&,id) double cvGetCaptureProperty( CvCaptu

用WPF实现一个弹幕播放器

最近写了一系列关于WPF二维动画的Blog,今天准备写个程序来实战一下.由于手头上确实没有什么好的例子,便写了个离线的弹幕播放器,效果如下: 实际上,用WPF实现一个弹幕播放器还是比较简单的,主要分为如下几个步骤: 下载离线弹幕文件,并解析为程序比较方便的识别格式 加载弹幕数据,并生成弹幕动画TimeLine,这里我将每一个弹幕用一个TextBlock表示,用一个Canvas来承载这些弹幕.用关键帧动画来表示弹幕,并将动画和TextBlock关联起来. 使用MediaElement加载弹幕,使用

opencv 显示一个图片/播放视频

//显示图片 #include"highgui.h" int main(int argc,char **argv) { IplImage *img=NULL; char *imgname="E:/实验/image/1.jpg"; img=cvLoadImage(imgname);//cvLoadImage加载一个图片 并返回一个IplImage指针 cvNamedWindow("test",0);//创建一个叫test的窗口,窗口大小固定 cvS

Android MVC实现一个音乐播放器

MVCPlayer 我尝试在android上使用MVC模式来开发一个音乐播放器.GitHub地址:https://github.com/skyhacker2/MVCPlayer 什么是MVC 来自维基百科 控制器 Controller - 负责转发请求,对请求进行处理. 视图 View - 界面设计人员进行图形界面设计. 模型 Model - 程序员编写程序应有的功能(实现算法等等).数据库专家进行数据管理和数据库设计(可以实现具体的功能). 那么在android上,Activity就是Cont

HTML5动画图片播放器 高端大气

我们见过很多图片播放插件(焦点图),很多都基于jQuery.今天介绍的HTML5图片播放器很特别,它不仅在图片间切换有过渡动画效果,而且在切换时图片中的元素也将出现动画效果,比如图中的文字移动.打散.重新组合等.这款HTML5动画图片播放器算得上是高端大气上档次. 在线演示源码下载 转载自:http://www.html5tricks.com/html5-image-player-with-animation.html HTML5动画图片播放器 高端大气

PyQt写的图片播放器简约版.

用PyQt写的图片播放器. 用线程控制. 线程之间的信号传递. 1 # -*- coding:utf-8 -*- 2 3 from PyQt4 import QtGui, QtCore 4 import sys, os, time 5 6 # from datetime import date, time, datetime, timedelta 7 QtCore.QTextCodec.setCodecForTr(QtCore.QTextCodec.codecForName("utf8"

WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放、图片立体轮播、图片倒影立体滚动)效果实现

原文:WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放.图片立体轮播.图片倒影立体滚动)效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,54寸大屏电脑电视一体机.要求有很炫的展示效果,要有一定的视觉冲击力,可触控操作.当然满足客户的要求也可以有其它途径.但鉴于咱是搞 .NET技术的,首先其冲想到的微软WPF方面,之前对WPF的了解与学习也只是停留在比较浅的层面,没有进一步深入学习与应用.所以在项目接来以后,也就赶鸭子上架了

C#制作一个消息拦截器(intercept)1

首先,我们先要制作一个自定义Attribute,让他可以具有上下文读取功能,所以我们这个Attribute类要同时继承Attribute和IContextAttribute. 接口IContextAttribute中有两个方法需要实现 1.bool   IsContextOK(Context ctx, IConstructionCallMessage msg); 2.void  GetPropertiesForNewContext(IConstructionCallMessage msg); 简