在Qt中如何用纯代码写一个本地视频播放器
一、首先用纯代码写本地视频播放器需要用到以下类
#include <QWidget>
#include <QHBoxLayout> //水平布局
#include <QVBoxLayout> //垂直布局
#include <QVideoWidget>
#include <QMediaPlayer>
#include <QPushButton>
#include <QSlider> //进度条
#include <QStyle>
#include <QFileDialog>
#include <QTimer>
#include <QLabel>
#include <QListWidget>
#include <QTime>
#include <QDebug>
二、Widget类中放的成员函数、数据成员和槽函数
public:
Widget(QWidget *parent = 0);
~Widget();
//创建一个播放视频的成员函数
void Pplay(QString box);
//做一个顺序播放的成员函数,点击下一首的时候和视屏播放完的时候都可以调用
void sort_play();
private slots:
//按下按钮选择视频
void video_show();
//按下按钮播放、暂停视频
void play_pause();
//当1s时间一到更新一些东西
void update();
//根据位置的变化来设置进度条的位置
void update_player_slider(qint64 port);
//根据时长的变化来获取播放的总时长,设置给进度条的范围
void update_player_range(qint64 port);
//根据改变滑块的位置改变播放的进度
void update_play_jindu(int port);
//根据音量滑块的位置更改声音大小
void update_volume(int port);
//双击这个视频,播放这个视频
void video_itemDoubleClicked(QListWidgetItem *item);
//点击上一个视频
void up_clicked();
//点击下一个视频
void down_clicked();
private:
//创建音频指针对象
QMediaPlayer *mediaPlayer;
//创建视频指针对象
QVideoWidget *videoWidget;
//创建两个标签(一个存放视频名字,一个存放视频播放的进度)
QLabel *video_name,*video_play_jindu;
//创建一个选择视频的按钮,和播放暂停按钮.上一个视频,下一个视频按钮
QPushButton *chooseBtn, *playBtn,*up_video,*down_video;
//创建一个视频进度条,创建一个音量进度条
QSlider *video_slider,*volume_slider;
//创建一个视频链表
QListWidget *list_video;
//创建一个定时器
QTimer *timer;
//记录一个次数,用来滚动视频名字
int n;
//记录当前播放的歌曲在链表的什么位置
int port;
//存放视频的名字
QString name;
三、Main函数
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//加载样式表
QFile file("style.qss");
file.open(QFile::ReadOnly);
if(file.isOpen())
{
a.setStyleSheet(file.readAll());
file.close();
}
Widget w;
w.show();
w.setWindowTitle("视频播放器");
return a.exec();
}
四、widget.cpp
(1)先看构造函数
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//先实例化对象
this->mediaPlayer = new QMediaPlayer(this);
this->videoWidget = new QVideoWidget(this);
this->videoWidget->setMinimumSize(400,400);
this->list_video = new QListWidget(this);
//实例化整个窗口的布局
QVBoxLayout *vbox = new QVBoxLayout(this);
//设置整个窗口的布局为垂直布局
this->setLayout(vbox);
//实例化需要的控件
this->video_name = new QLabel("视频名字",this);
this->video_play_jindu = new QLabel("00:00/00:00",this);
this->chooseBtn = new QPushButton("选择视频",this);
this->up_video = new QPushButton("上一个视频",this);
this->down_video = new QPushButton("下一个视频",this);
this->playBtn = new QPushButton(this);
playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPlay));
this->video_slider = new QSlider(this);
this->video_slider->setOrientation(Qt::Horizontal);//设置其为水平方向上的进度条
this->volume_slider = new QSlider(this);
this->volume_slider->setOrientation(Qt::Horizontal);
//设置音量的范围
this->volume_slider->setRange(0,100);
//设置音量的初始大小
this->volume_slider->setValue(50);
this->mediaPlayer->setVolume(50);
//实例化一个水平布局
QHBoxLayout *hbox = new QHBoxLayout(this);
//给水平布局中添加控件
hbox->addWidget(this->videoWidget);
hbox->addWidget(this->list_video);
//实例化一个水平布局
QHBoxLayout *hbox1 = new QHBoxLayout(this);
//给水平布局中添加控件
hbox1->addWidget(this->chooseBtn);
hbox1->addWidget(this->up_video);
hbox1->addWidget(this->down_video);
//实例化一个水平布局
QHBoxLayout *hbox2 = new QHBoxLayout(this);
//给水平布局中添加控件
hbox2->addWidget(this->video_name);
hbox2->addWidget(this->video_play_jindu);
//实例化一个水平布局
QHBoxLayout *hbox3 = new QHBoxLayout(this);
//给水平布局中添加控件
hbox3->addWidget(this->playBtn);
hbox3->addWidget(this->video_slider);
hbox3->addWidget(this->volume_slider);
//将播放窗口+水平布局都添加到垂直布局中
vbox->addLayout(hbox);
vbox->addLayout(hbox1);
vbox->addLayout(hbox2);
vbox->addLayout(hbox3);
//实例化定时器
this->timer= new QTimer(this);
//初始化次数
this->n = 0;
//初始化歌曲在链表的位置
this->port = 0;
//选择视频按钮的业务
connect(this->chooseBtn,SIGNAL(clicked()),this,SLOT(video_show()));
//播放、暂停按钮的业务
connect(this->playBtn,SIGNAL(clicked()),this,SLOT(play_pause()));
//根据位置的变化来设置进度条的位置
connect(this->mediaPlayer,SIGNAL(positionChanged(qint64)),this,SLOT(update_player_slider(qint64)));
//根据时长的变化来获取播放的总时长,设置给进度条的范围
connect(this->mediaPlayer,SIGNAL(durationChanged(qint64)),this,SLOT(update_player_range(qint64)));
//根据滑块的位置改变播放的进度
connect(this->video_slider,SIGNAL(sliderMoved(int)),this,SLOT(update_play_jindu(int)));
//根据音量滑块的位置更改声音大小
connect(this->volume_slider,SIGNAL(sliderMoved(int)),this,SLOT(update_volume(int)));
//当1s时间一到更新一些东西
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
//双击这个视频,播放这个视频
connect(this->list_video,SIGNAL(itemDoubleClicked(QListWidgetItem *)),this,SLOT(video_itemDoubleClicked(QListWidgetItem *)));
//点击上一个视频
connect(this->up_video,SIGNAL(clicked()),this,SLOT(up_clicked()));
//点击下一个视频
connect(this->down_video,SIGNAL(clicked()),this,SLOT(down_clicked()));
}
(2)播放视频的成员函数
void Widget::Pplay(QString box)
{
this->mediaPlayer->setMedia(QUrl(box));
QFileInfo info(box);
//输出视频的画面
this->mediaPlayer->setVideoOutput(this->videoWidget);
//显示视频名称
this->name = info.fileName()+" ";
this->video_name->setText(name);
//播放
qDebug() << "xixixi";
this->mediaPlayer->play();
qDebug() << "hahah";
//开启定时器
this->timer->start(1000);
this->playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaStop));
}
(3)点击下一个视频的成员函数、点击下一首的时候和视屏播放完的时候都可以调用
void Widget::sort_play()
{
//如果此时是最后一个视频,则跳到第一个视频
if(this->port == list_video->count()-1)
{
this->port = 0;
}
else
{
this->port++;
}
this->Pplay("C:/Users/Administrator/Desktop/video/"+list_video->item(this->port)->text());
}
(4)点击选择视频按钮执行的槽函数
void Widget::video_show()
{
QString filename =QFileDialog::getOpenFileName(this, "选择", "C:/Users/Administrator/Desktop/video/", "MP4(*.mp4)");
//设置媒体--显示声音
QFileInfo video(filename);
//需要有QListWidgetItem
int i = 0;
while(i < this->list_video->count())
{
//进行信息比对
if(this->list_video->item(i)->text() == video.fileName())
{
break;
}
i++;
}
if(i == this->list_video->count())//说明链表没有这个视频,这个视频是新视频
{
QListWidgetItem *item = new QListWidgetItem(this->list_video);
item->setText(video.fileName());
this->list_video->addItem(item);
}
this->port = i;
this->Pplay(filename);
}
(5)按下播放暂停按钮所执行的槽函数
void Widget::play_pause()
{
int ret = this->mediaPlayer->state();
if(ret == QMediaPlayer::PlayingState)
{
this->mediaPlayer->pause();
playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPlay));
}
else
{
this->mediaPlayer->play();
playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaStop));
}
}
(6)定时器时间到了所执行的槽函数 时间为1s
void Widget::update()
{
this->n++;
if(this->n == this->name.size()-1)
{
this->n = 0;
}
video_name->setText(this->name.mid(this->n));
//显示总时长(毫秒)和当前播放的时长
qint64 dur = this->mediaPlayer->duration();
qint64 pos = this->mediaPlayer->position();
QTime time1(0,0,0);
QTime time2(0,0,0);
video_play_jindu->setText(time1.addMSecs(int(pos)).toString("mm:ss")+"/"+time2.addMSecs(int(dur)).toString("mm:ss"));
//判断这个视频是否播放完
if(dur == pos && dur != 0)
{
//播放完就跳到下一个视频
this->sort_play();
}
}
(7)根据位置的变化来设置进度条的位置
void Widget::update_player_slider(qint64 port)
{
this->video_slider->setValue(int(port));
}
(8)根据时长的变化来获取播放的总时长,设置给进度条的范围
void Widget::update_player_range(qint64 port)
{
this->video_slider->setRange(0,int(port));
}
(9)根据改变滑块的位置改变播放的进度
void Widget::update_play_jindu(int port)
{
this->mediaPlayer->setPosition(port);
}
(10)根据音量滑块的位置更改声音大小
void Widget::update_volume(int port)
{
this->mediaPlayer->setVolume(port);
}
(11)双击这个视频,播放这个视频
void Widget::video_itemDoubleClicked(QListWidgetItem *item)
{
this->port = item->listWidget()->currentRow();
this->Pplay("C:/Users/Administrator/Desktop/video/"+item->text());
}
(12)点击上一个视频
void Widget::up_clicked()
{
//如果此时是第一个视频,则跳到最后一个视频
if(this->port == 0)
{
this->port = this->list_video->count()-1;
}
else
{
this->port--;
}
this->Pplay("C:/Users/Administrator/Desktop/video/"+list_video->item(this->port)->text());
}
(12)点击下一个视频
void Widget::down_clicked()
{
//直接调用播放下一个视频的成员函数
this->sort_play();
}
五、总结
我认为纯代码写还是没有UI方便,但是UI中也有局限的地方,比如说视频播放的屏幕显示,我所用的Qt的版本没有对要用的类QVideoWidget进行封装,所以只能用纯代码编写,有很多不足之处还请各位大佬指点。
在Qt中如何用纯代码写一个本地视频播放器相关推荐
- 我想写一个网络视频播放器
最近两个月跟着斯坦福大学白胡子老头的公开课学习了一下swift语言下的ios应用开发,作为实践,我计划开发自己的第一款App:网络视频播放器. 产品设计 什么,就你一个搬砖的还要产品设计?好好,没有产 ...
- 300行代码写一个音乐播放器小程序
刚进公司不久,因为公司部门年后业务拓展的关系,可能在年后会被分配到公司的微信公众号组做小程序相关的开发工作,因此写了个微信小程序wx-audio踩坑.目前还有一些功能没有写完:如返回多首歌曲.控制播放 ...
- 如何用PYTHON代码写出音乐
如何用PYTHON代码写出音乐 什么是MIDI 博主本人虽然五音不全,而且唱歌还很难听,但是还是非常喜欢听歌的.我一直在做这样的尝试,就是通过人工智能算法实现机器自动的作词和编曲(在这里预告下,通过深 ...
- 如何用最简洁的css代码写一个导航栏
如何用最简洁的css代码写一个导航栏 首先我们在里面通过标签添加一个logo,然后通过标签简单的设置几个导航栏中的内容. 注:标签主要是用于设置超链接. <div><img src= ...
- python怎么实现音乐快进_如何用PYTHON代码写出音乐【】
如何制作MIDI(用于vocaloid 3) 我也是因为V家才来找midi的 如何用PYTHON代码写出音乐 在python-midi,每个乐谱用Pattern对象表示,乐的每个音轨(通常音乐很多轨道 ...
- android三角形切图软件,还在为小三角形切图?使用纯CSS写一个简单的三角形
同学们,当美工给的设计图是这样: 或者这样: 我的内心其实是拒绝的-_-:但工作还得干,大部分同学会写 .icon{width:20px;height:20px;display:block;margi ...
- 如何用纯 CSS 创作一个小球上台阶的动画
如何用纯 CSS 创作一个小球上台阶的动画 效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/come ...
- 如何用Java自己写一个.exe程序
如何用Java自己写一个.exe程序 之前遇到要写一个 .exe程序的一个题,后面在网上查阅资料,发现Java其实也是可以转换成exe程序的,但是要借助一些工具生成,我是用exe4j生成.exe程序. ...
- 如何用C语言写一个web服务器的基础功能
我们都知道,学一门语言,只是单独看了就不写的话是很容易出现眼高手低的,所以,今天摩杜云要给大家分享的内容,就是如何用C语言写一个web服务器的基础功能,希望大家看完有所收获. 服务器架构 目标架构 以 ...
最新文章
- 开发各种信息管理系统的标准演示数据都帮你整理好了,少了录入演示\测试\模拟数据的烦恼了[提供下载]...
- Windows XP任务管理器内进程名详解
- Delphi 正则表达式语法(9): 临界匹配 - 也叫预搜索与反向预搜索
- 后端返回number类型数据_Javascript基础教程之数据类型 (数值 Number)
- OAuth2认证有一定的了解
- 1062. Talent and Virtue (25)
- 免费个人博客:使用hexo+github搭建详细教程
- 为此计算机上的所有用户安装此加载项,activex 安装给所有计算机用户
- STM32F103 - CubeMX 的使用实例详细(04.5)- STM32F103的 - 定时器设定详细解释 - 定时器相关的HAL接口函数 - 定时器的中断
- Linux安装中遇到如下错误提示:"cannot find appropriate C++ compiler on this system"
- MySQL备份mydumper的原理【转】
- Linux 新漏洞曝光,居然又双叒是提升权限漏洞!
- 宣城市加快运用大数据推动全域旅游发展
- 苹果8黑屏无法强制开机_iphonexsmax死机黑屏,iphonexsmax无法开机
- win7下使用变色龙引导linux
- 数据结构之栈和队列(顺序栈、链栈、循环队列)
- HDFS中NameNode和Secondary NameNode
- UITextView - 2
- java半角英数check_jQuery教程之输入内容控制为半角英数字+限定符号问题如何解决...
- NAO学习第二周——NAOqi Audio