在linux下QT设计实现视频播放器
通过QT对mplayer的应用,实现视频播放器的功能,包括开始播放、暂停播放、继续播放、终止播放、播放上一个、播放下一个、添加指定目录下的视频、删除指定视频、清空列表。应用到multimedia、multimediawidgets库和QStringList、QFileDialog等类。界面效果如下:videoplayer.h#ifndef VIDEOPLAYER_H#define VIDEOPLA
·
通过QT对mplayer的应用,实现视频播放器的功能,包括开始播放、暂停播放、继续播放、终止播放、播放上一个、播放下一个、添加指定目录下的视频、删除指定视频、清空列表。应用到multimedia、multimediawidgets库和QStringList、QFileDialog等类。
界面效果如下:
videoplayer.h
#ifndef VIDEOPLAYER_H
#define VIDEOPLAYER_H
#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QListWidgetItem>
#include <QVideoWidget>
#include "myvideowidget.h"
QT_BEGIN_NAMESPACE
namespace Ui { class VideoPlayer; }
QT_END_NAMESPACE
class VideoPlayer : public QMainWindow
{
Q_OBJECT
public:
VideoPlayer(QWidget *parent = nullptr);
~VideoPlayer();
//重写事件过滤器函数
virtual bool eventFilter(QObject *watched,QEvent *event);
void add_Layout(QWidget *w);
private slots:
void on_listWidget_itemDoubleClicked(QListWidgetItem *item);
void on_pushButton_start_clicked();
void on_pushButton_stop_cont_clicked();
void on_pushButton_stop_clicked();
void on_pushButton_fullscreen_clicked();
void on_pushButton_prev_clicked();
void on_pushButton_next_clicked();
void on_pushButton_add_video_clicked();
void on_pushButton_del_video_clicked();
void on_pushButton_clear_video_clicked();
void on_horizontalSlider_sliderMoved(int position);
void on_verticalSlider_sliderMoved(int position);
//周期改变函数
void set_sider(qint64 duration);
//进度改变
void set_value(qint64 position);
private:
Ui::VideoPlayer *ui;
QMediaPlayer *player;
//QVideoWidget *videow;
MyVideoWidget *videow;
QMediaPlaylist *playlist;
QString video_duration;
};
#endif // VIDEOPLAYER_H
videoplayer.cpp
#include "videoplayer.h"
#include "ui_videoplayer.h"
#include <QFileDialog>
#include <QTime>
#include <QDebug>
#include <QKeyEvent>
VideoPlayer::VideoPlayer(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::VideoPlayer)
{
ui->setupUi(this);
player = new QMediaPlayer(this);
videow = new MyVideoWidget(this);
playlist = new QMediaPlaylist(this);
//为videow安装过滤器 ----- 主窗口
//videow->installEventFilter(this);
//将QVideoWidget加入布局管理器
ui->horizontalLayout->addWidget(videow);
//设置QMediaPlayer的videooutput
player->setVideoOutput(videow);
//设置播放模式
playlist->setPlaybackMode(QMediaPlaylist::Loop);
//设置播放器的播放列表
player->setPlaylist(playlist);
//连接信号和槽
QObject::connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(set_sider(qint64)));
QObject::connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(set_value(qint64)));
//禁止暂停按钮
ui->pushButton_stop_cont->setEnabled(false);
}
VideoPlayer::~VideoPlayer()
{
delete ui;
}
bool VideoPlayer::eventFilter(QObject *watched,QEvent *event)
{
//按键事件
if(event->type()==QEvent::KeyPress){
QKeyEvent *keyevent = dynamic_cast<QKeyEvent *>(event);
//按了Esc,退出全屏
if(keyevent->key()==Qt::Key_Escape){
//恢复播放窗口为子窗口
videow->setWindowFlag(Qt::SubWindow);
//退出全屏
videow->showNormal();
//重设父窗口
videow->setParent(this);
//重新加入布局管理器
ui->horizontalLayout->addWidget(videow);
}
}
//调用基类的过滤器处理函数
return QMainWindow::eventFilter(watched,event);
}
void VideoPlayer::add_Layout(QWidget *w)
{
ui->horizontalLayout->addWidget(w);
}
void VideoPlayer::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
int row = ui->listWidget->currentRow();
playlist->setCurrentIndex(row);
//设置音量
player->setVolume(ui->verticalSlider->value());
player->play();
ui->pushButton_stop_cont->setEnabled(true);
}
//开始播放
void VideoPlayer::on_pushButton_start_clicked()
{
//当选中新的视频文件或者不是暂停状态===>重新播放
if(ui->listWidget->currentRow()!=playlist->currentIndex()||
player->state()!=QMediaPlayer::PausedState){
//指定当前播放文件
int row = ui->listWidget->currentRow();
playlist->setCurrentIndex(row);
//设置音量
player->setVolume(ui->verticalSlider->value());
}
player->play();
ui->pushButton_stop_cont->setEnabled(true);
}
//停止
void VideoPlayer::on_pushButton_stop_cont_clicked()
{
player->pause();
ui->pushButton_stop_cont->setEnabled(false);
}
//暂停
void VideoPlayer::on_pushButton_stop_clicked()
{
player->stop();
ui->pushButton_stop_cont->setEnabled(false);
}
//全屏
void VideoPlayer::on_pushButton_fullscreen_clicked()
{
//把子窗口提升为顶层窗口
videow->setWindowFlag(Qt::Window);
//全屏
videow->showFullScreen();
}
void VideoPlayer::on_pushButton_prev_clicked()
{
int row = ui->listWidget->currentRow();
if(row==0)
row = ui->listWidget->count();
row--;
ui->listWidget->setCurrentRow(row);
on_listWidget_itemDoubleClicked(ui->listWidget->currentItem());
}
void VideoPlayer::on_pushButton_next_clicked()
{
int row = ui->listWidget->currentRow();
if(row==ui->listWidget->count()-1)
row = 0;
else
row++;
ui->listWidget->setCurrentRow(row);
on_listWidget_itemDoubleClicked(ui->listWidget->currentItem());
}
void VideoPlayer::on_pushButton_add_video_clicked()
{
QStringList video_files = QFileDialog::getOpenFileNames(this,"选择视频文件","./video","*.mp3 *.mp4 *.avi");
//去重
for(int i=0;i<ui->listWidget->count();i++){
for(int j=0;j<video_files.count();j++){
if(ui->listWidget->item(i)->text()==video_files.at(j)){
video_files.removeAt(j);
break;
}
}
}
//如果无添加文件,直接返回
if(video_files.isEmpty())
return;
//添加到listWidget和playlist
for(int i=0;i<video_files.count();i++){
QString file = video_files.at(i);
//把文件加入播放列表
playlist->addMedia(QUrl::fromLocalFile(file));
}
ui->listWidget->addItems(video_files);
//定位
ui->listWidget->setCurrentRow(0);
}
void VideoPlayer::on_pushButton_del_video_clicked()
{
int row = ui->listWidget->currentRow();
//取出一项
QListWidgetItem *item = ui->listWidget->takeItem(row);
if(item){
delete item;
}
//如果删除了正在播放的视频,禁止暂停
if(row==playlist->currentIndex())
ui->pushButton_stop_cont->setEnabled(false);
//从播放列表删除
playlist->removeMedia(row);
}
void VideoPlayer::on_pushButton_clear_video_clicked()
{
ui->listWidget->clear();
//清空播放列表
playlist->clear();
ui->pushButton_stop_cont->setEnabled(false);
}
void VideoPlayer::on_horizontalSlider_sliderMoved(int position)
{
player->setPosition(position);
}
void VideoPlayer::on_verticalSlider_sliderMoved(int position)
{
player->setVolume(position);
//更新显示
ui->label_volume->setText(QString("音量:%1").arg(position));
}
//周期改变函数
void VideoPlayer::set_sider(qint64 duration)
{
qDebug()<<duration;
if(duration!=0)
{
//设置进度条最大值
ui->horizontalSlider->setRange(0,duration);
QTime t = QTime(duration/1000/60/60,duration/1000/60%60,duration/1000%60);
//显示周期
video_duration = t.toString("hh:mm:ss");
ui->label_duration_position->setText(QString("00:00:00/%1").arg(video_duration));
//显示歌曲切换
ui->listWidget->setCurrentRow(playlist->currentIndex());
}
}
//进度改变
void VideoPlayer::set_value(qint64 position)
{
//更新进度条的值
ui->horizontalSlider->setValue(position);
QTime t = QTime(position/1000/60/60,position/1000/60%60,position/1000%60);
//显示进度
ui->label_duration_position->setText(QString("%1/%2").
arg(t.toString("hh:mm:ss")).arg(video_duration));
}
myvideowidget.h
#ifndef MYVIDEOWIDGET_H
#define MYVIDEOWIDGET_H
#include <QVideoWidget>
class MyVideoWidget : public QVideoWidget
{
Q_OBJECT
public:
MyVideoWidget(QWidget *parent=0);
//重写按键事件处理函数
virtual void keyPressEvent(QKeyEvent *event);
private:
QWidget *p;
};
#endif // MYVIDEOWIDGET_H
myvideowidget.cpp
#include "myvideowidget.h"
#include <QKeyEvent>
#include "videoplayer.h"
MyVideoWidget::MyVideoWidget(QWidget *parent):QVideoWidget(parent)
{
//记录父对象
p = parent;
}
void MyVideoWidget::keyPressEvent(QKeyEvent *event)
{
if(event->key()==Qt::Key_Escape){
//恢复播放窗口为子窗口
this->setWindowFlag(Qt::SubWindow);
//退出全屏
this->showNormal();
//重设父窗口
this->setParent(p);
//重新加入布局管理器
VideoPlayer *vp = dynamic_cast<VideoPlayer *>(p);
vp->add_Layout(this);
}
return QVideoWidget::keyPressEvent(event);
}
main.cpp
#include "videoplayer.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
VideoPlayer w;
w.show();
return a.exec();
}
完整工程代码:https://download.csdn.net/download/weixin_43793181/20334966
更多推荐
已为社区贡献3条内容
所有评论(0)