QT制作一个图片播放器
前言:使用qt制作了一个简单的图片播放器,可以播放gif、png等格式图片
先来看看播放器的功能(当然是很简陋的,没有很深入的设计):
1、点击图片列表中图片进行播放。
2、自动播放,播放的图片的间隔时间可以自己设定,时间的单位是秒。
3、自动播放的时候再点击图片列表会停止自动播放,保存当前播放的图片的顺序,再次点击自动播放的时候将从当前开始。
4、自动播放到最后一张图片的时候将会停止自动播放,再次点击自动播放的时候将会从第一张图片开始。
先上图看看具体功能:
说完功能我们聊聊制作思路和使用到的主要代码:
1、打开有图片的文件,并获取文件的路径
Dir = QFileDialog::getExistingDirectory(this);//获取文件所在的具体路径
2、把文件的路径显示在指定的窗口
ui->photoPath->setText(Dir);//显示打开的文件的具体路径
3、列出文件中的图片的路径,建立小图标,并把图片路径保存到容器中,方便自动播放
//列出目录下的文件
for(int i=;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()*);//启动定时器并设置播放时间间隔
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 = );
~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 = ; 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=;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 = ;
}
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() == )
{
QMessageBox::warning(this,"警告","还没有可以播放的图片");
ui->autoPhoto->setCheckState(Qt::Unchecked); //把按钮重新置于没有被选中的状态
return;
} else if(checked) //启动定时器
{
delayTime = ui->delayEdit->text();
mtime->start(delayTime.toInt()*);//启动定时器并设置播放时间间隔
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()-))
{
qDebug()<<num;
mtime->stop();
num = ;
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
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x></x>
<y></y>
<width></width>
<height></height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget">
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x></x>
<y></y>
<width></width>
<height></height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number></number>
</property>
<property name="bottomMargin">
<number></number>
</property>
<item>
<widget class="QTextBrowser" name="photoPath">
<property name="maximumSize">
<size>
<width></width>
<height></height>
</size>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QPushButton" name="pathBt">
<property name="text">
<string>浏览</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="">
<size>
<width></width>
<height></height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number></number>
</property>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="">
<size>
<width></width>
<height></height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="delayEdit">
<property name="maximumSize">
<size>
<width></width>
<height></height>
</size>
</property>
<property name="placeholderText">
<string>间隔时间(秒)</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="autoPhoto">
<property name="text">
<string>自动播放</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="">
<size>
<width></width>
<height></height>
</size>
</property>
</spacer>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="">
<size>
<width></width>
<height></height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x></x>
<y></y>
<width></width>
<height></height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QListWidget" name="photoList">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
<horstretch></horstretch>
<verstretch></verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width></width>
<height></height>
</size>
</property>
<property name="sizeIncrement">
<size>
<width></width>
<height></height>
</size>
</property>
<property name="baseSize">
<size>
<width></width>
<height></height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="photoShow">
<property name="maximumSize">
<size>
<width></width>
<height></height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QStatusBar" name="statusBar"/>
</widget>
<layoutdefault spacing="" margin=""/>
<resources/>
<connections/>
</ui>
具体界面如下
QT制作一个图片播放器的更多相关文章
- 用 EPWA 写一个 图片播放器 PicturePlayer
用 EPWA 写一个 图片播放器 PicturePlayer . 有关 EPWA,见 <我发起并创立了一个 EPWA 的 开源项目> https://www.cnblogs.com ...
- 吴裕雄--天生自然python学习笔记:python 用pygame模块制作一个音效播放器
用 Sound 对象制作一个音效播放器. 应用程序总览 程序在执行后默认会把 WAV 音频文件加载到清单中,单击“播放”按钮可开始 播放,同时显示 “正在播放 xxx 音效”的信息 . 播放过程中,可 ...
- Qt 简易图片播放器
一.前言 使用 Qt 制作了一个简单的图片播放器,点击 "浏览按钮" 浏览图片所在目录,目录中的所有图片缩小图标和名称会显示在左侧的图片列表中,点击列表中的图片项,可以在右侧区域的 ...
- 师兄写的一个JAVA播放器的源代码(转)
师兄写的一个JAVA播放器的源代码 MediaPlayer.java------------------------------------------------------------------ ...
- HTML5动画图片播放器 高端大气
我们见过很多图片播放插件(焦点图),很多都基于jQuery.今天介绍的HTML5图片播放器很特别,它不仅在图片间切换有过渡动画效果,而且在切换时图片中的元素也将出现动画效果,比如图中的文字移动.打散. ...
- WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放、图片立体轮播、图片倒影立体滚动)效果实现
原文:WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放.图片立体轮播.图片倒影立体滚动)效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7 ...
- 大半宿,封装了一个MP3播放器的类,写了个简陋的播放器
用 winmm.lib 写的 封装不是很好,而且没有优化,效率可能有问题,但是现在几乎没有什么大问题 我用我封装的类,写了一个小播放器,界面上的所有功能都实现了,包括双击列表中的文件名,直接播放文件 ...
- JavaCV 学习(二):使用 JavaCV + FFmpeg 制作拉流播放器
一.前言 在 Android 音视频开发学习思路 中,我们不断的学习和了解音视频相关的知识,随着知识点不断的学习,我们现在应该做的事情,就是将知识点不断的串联起来.这样才能得到更深层次的领悟.通过整理 ...
- 基于Qt的开源音乐播放器(CZPlayer)
CZPlayer CZPlayer是基于Qt开发的一款功能强大的音乐播放器,该播放器的论坛地址请点击here,目前CZPlayer已经是第四个版本了,历史版本也分别在我的github上, github ...
随机推荐
- MQTT——编写连接报文
笔者在上一章对连接报文进行了相关的讲解.这一章笔者想写一个连接报文的例子来加深理解.本来这一章也应该在上一章出现的.可是笔者怕太长了.不好方便阅.所以决定分俩章来.正如笔者上一章所讲的.笔者会用Net ...
- 【转载】目前主流过滤XSS的三种技术
目前主流过滤XSS的三种技术 过滤 过滤,顾名思义,就是将提交上来的数据中的敏感词汇直接过滤掉.例如对"<script>"."<a>". ...
- R-CNN论文翻译——用于精确物体定位和语义分割的丰富特征层次结构
原文地址 我对深度学习应用于物体检测的开山之作R-CNN的论文进行了主要部分的翻译工作,R-CNN通过引入CNN让物体检测的性能水平上升了一个档次,但该文的想法比较自然原始,估计作者在写作的过程中已经 ...
- iOS隐藏导航栏底部灰线
首先创建 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #de38a5 } span.s1 { } span.s ...
- Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0,"解决办法
这是因为先安装了 .NET Framework 4,随后启用了 .NET Framework 3.5 WCF HTTP 激活,则会发生此错误. 只需要已管理员用户在cmd中运行aspnet_regii ...
- Cordova cannot add Android failed with exit code ENOENT
这可能是系统环境变量损坏了 解决方案:在系统变量path如果没用下面的变量就加上%SystemRoot%\system32; %SystemRoot%; %SystemRoot%\System32\W ...
- eclipse中导入jsp等工程使用过程中常遇问题
1.导入的工程JSP文件出现报错的情况 这个一般不怎么影响文件的执行,这些文件飘红主要是因为eclipse的校验问题. 具体错误信息:Multiple annotations found at thi ...
- javaScript属性
------------------------------------行内样式------------------------------------ *基本标签html 网页的开始标记head 网 ...
- [C#]使用dnSpy对目标程序(EXE或DLL)进行反编译修改并编译运行
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的工具下载地址为: https://github.com/cnxy/dnSpy/arc ...
- jinja2模板常用方法
数学运算+,-,*,/,**,//,%等数学运算符都支持. 逻辑运算and,or,not也同样支持 1.in判断元素是否在集合中 2.|管道操作符,默认使用Apply调用一个方法 3.~字符串连接 4 ...