qt视频播放界面类设计

0、显示效果

在这里插入图片描述

1、设计思路

使用qt制作播放器方法有很多,但是不使用第三方库,则只能使用QVideoWidget类+QMediaPlayer类方法(这里话说太满了,容易被打脸)

  • QVideoWidget类是一个继承QWidget的界面类,用于视频显示。
  • QMediaPlayer类用于解析音频文件和视频文件,继承自QMediaObjectQMediaObject可以提供关于媒体内容的接入,通过URL进行初始化,同时也可以提供可以播放的媒体文件的列表,与QMediaplayer对象息息相关。

qt视频播放界面类VideoWidget,则是集合了QVideoWidget类+QMediaPlayer类,将该搭档组合在了一起,在VideoWidget类中实例化,并设置外部视频播放控制所必要的接口,如播放、暂停、停止、设置播放速度、设置播放视频等等(具体看源代码中h文件)。

既然是界面类设计,所以VideoWidget是继承QWidget类,后期应用也是使用QWidget提升。

2、源代码

h文件:

#ifndef VIDEOWIDGET_H
#define VIDEOWIDGET_H

#include <QObject>
#include <QWidget>
#include <QVideoWidget>
#include <QMediaPlayer>

class VideoWidget : public QWidget
{
    Q_OBJECT
public:
    explicit VideoWidget(QWidget *parent = nullptr);
    ~VideoWidget();
    void setVideoName(QString name);
    QString getVideoName();  //获取导入的视频名字

    void init();    //播放初始化,初始化一些状态

    bool play();    //启动,无设置视频名情况下失败返回0
    bool pause();
    bool stop();    //关闭,无播放情况下失败返回0
    void setPlaySpeed(double speed);    //设置播放速度

    quint64 getDuration();  //获取视频时长
    bool setPlayPos(quint64 position);
    quint64 getCurrentPlyPos();

    void setVideoBackColor(QColor color);

signals:
    void stateChanged(QMediaPlayer::State); //播放状态改动
    void positionChanged(qint64);   //播放位置改动
    void durationChanged(qint64);   //播放时间改动

private slots:
    void OnStateChanged(QMediaPlayer::State enumState);

private:
    QVideoWidget *mVideoWidget;
    QMediaPlayer *mPlayer;
    QString videoName;
    QMediaPlayer::State mState;

    void resizeEvent(QResizeEvent *event);
};

#endif // VIDEOWIDGET_H

cpp文件:

#include "videowidget.h"

VideoWidget::VideoWidget(QWidget *parent) : QWidget(parent)
{
    mVideoWidget = new QVideoWidget(this);
    mPlayer = new QMediaPlayer;
    mPlayer->setVideoOutput(mVideoWidget);    //设置视频输出显示位置

    //设置视频外的背景为黑色
    mVideoWidget->setAutoFillBackground(true);
    QPalette palette(QPalette::Window, QColor(0,0,0));
    mVideoWidget->setPalette(palette);

    connect(mPlayer,SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(OnStateChanged(QMediaPlayer::State)));
    connect(mPlayer,SIGNAL(positionChanged(qint64)),this,SIGNAL(positionChanged(qint64)));
    connect(mPlayer,SIGNAL(durationChanged(qint64)),this,SIGNAL(durationChanged(qint64)));
}

VideoWidget::~VideoWidget()
{
    delete mPlayer;
    delete mVideoWidget;
}

void VideoWidget::init()
{

}

void VideoWidget::setVideoName(QString name)
{
    mPlayer->setMedia(QUrl::fromLocalFile(name));  //给播放器设置视频路劲
    videoName = name;
}
QString VideoWidget::getVideoName()
{
    return videoName;
}

bool VideoWidget::play()
{
    if(videoName.isEmpty())
        return 0;
    mPlayer->play();
    return 1;
}
bool VideoWidget::pause()
{
    if(mState != QMediaPlayer::PlayingState)
        return 0;
    mPlayer->pause();
    return 1;
}
bool VideoWidget::stop()
{
    if(mState == QMediaPlayer::StoppedState)
        return 0;
    mPlayer->stop();
    return 1;
}

void VideoWidget::setPlaySpeed(double speed)
{
    mPlayer->setPlaybackRate(speed);    //设置播放速度
}

quint64 VideoWidget::getDuration()
{
    return mPlayer->duration();
}
bool VideoWidget::setPlayPos(quint64 position)
{
    if(mState == QMediaPlayer::StoppedState)
        return 0;
    mPlayer->setPosition(position);
    return 1;
}
quint64 VideoWidget::getCurrentPlyPos()
{
    return mPlayer->position(); //返回播放位置值
}

void VideoWidget::setVideoBackColor(QColor color)
{
    QPalette palette(QPalette::Window, color);
    this->setPalette(palette);
}

void VideoWidget::OnStateChanged(QMediaPlayer::State enumState)
{
    mState = enumState;     //获取状态
    emit stateChanged(enumState);   //对外发送状态
}

void VideoWidget::resizeEvent(QResizeEvent *event)
{
    mVideoWidget->setGeometry(0,0,this->width(),this->height());
}

3、demo设计

pro文件记得添加模块:

QT       += core gui multimedia multimediawidgets

mainwindows界面设计如下:
在这里插入图片描述
然后对按钮等控件都添加信号槽,widget提升为设计好的VideoWidget
h文件就不贴了,mainwindows.cpp代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_select_clicked()
{
    QFileDialog dialog(this);       //打开一个文件选择窗口
    dialog.setFileMode(QFileDialog::AnyFile);   //设置任意文件可选
    QStringList fileNames;
    if (dialog.exec())
        fileNames = dialog.selectedFiles();     //获取选择的文件链表

    if(!fileNames.empty())
       ui->widget->setVideoName(fileNames.at(0));  //给播放器设置视频路劲
}

void MainWindow::on_pushButton_start_clicked()
{
    ui->widget->play();
}

void MainWindow::on_pushButton_pause_clicked()
{
    ui->widget->pause();
}

void MainWindow::on_pushButton_stop_clicked()
{
    ui->widget->stop();
}

void MainWindow::on_comboBox_speed_currentIndexChanged(int index)
{
    if(index == 0) ui->widget->setPlaySpeed(0.5);
    else if(index == 1) ui->widget->setPlaySpeed(0.75);
    else if(index == 2) ui->widget->setPlaySpeed(0.1);
    else if(index == 3) ui->widget->setPlaySpeed(1.25);
    else if(index == 4) ui->widget->setPlaySpeed(1.5);
    else if(index == 5) ui->widget->setPlaySpeed(2);
}
  • 10
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
2022年11月4日-2022年11月14日购买当前课程赠送课程学习地址如下:https://edu.csdn.net/course/detail/32434https://edu.csdn.net/course/detail/35658https://edu.csdn.net/course/detail/30223https://edu.csdn.net/course/detail/32408https://edu.csdn.net/course/detail/32429注:因赠送课程不会出现在已订阅课程列表中,以下课程学习地址一定要收藏保存。#课程服务 在线答疑:本课程设有专门的讨论留言区,学习中遇到任何问题,直接给老师留言即可,老师都会及时进行回复。远程协助:如果遇到复杂问题,老师还可进行远程协助,这个一般可不是一两百元的课程就能享受到的。源码分享:为了让大家更好的进行项目实战,老师还将课程中涉及到的所有源码分享给学员,按照视频中的提示进行下载即可。在CSDN分享C++ Qt开发知识已经有6年了,感谢众多博友对我的支持,了解到很多人对Qt的使用还是有些困扰,例如Qt环境搭建,Qt布局的使用,如何使用Qt编写复杂的界面,如何自定义非标控件,Qt如何和Web交互,Qt和后台接口如何交互等;经过这几年的整理,我决定出这套《Qt高级开发视频教程》,带领大家学习Qt高级开发知识,学习如何使用Qt开发企业级别的项目;通过本课程的学习,大家将会达到企业招聘的中高级要求。为了照顾零基础学员,本课程第一章会介绍Qt环境搭建、QtCreator / VS2019的基本使用方法,Qt整体架构、Qt信号机制,Qt内存管理等知识。即使没有Qt开发的学习经验,也能跟着课程顺利学习。课程核心知识点地图如下: 课程每章核心知识点介绍如下: 第一章:介绍Qt环境搭建、QtCreator / VS2019的基本使用方法,Qt整体架构、Qt信号机制,Qt内存管理等知识。第二章:了解到很多学员对于Qt界面布局很不熟悉,将会详细介绍Qt设计器布局,以及如何C++代码手写布局,从常见的企业级项目入手,带领大家学会各种布局的实现,例如WPS、腾讯会议、优酷、迅雷等界面的实现;界面布局会了,这是企业项目开发的第一步,还有更重要的无边框窗口,如何设计一个合理的无边框窗口很重要,第三/四章:详细介绍如何实现一个无边框窗口,如何自定义标题栏,如何实现拖拽拉伸;第四章将会介绍如何自定义非标控件,优化Qt界面。第五章:介绍Qt web混合编程,一个商用项目,必然会涉及到web交互,这也是很多Qt开发者的弱项,这一章讲详细介绍C++ Qt web混合开发。第六章:既然是做企业级项目,必然需要和后台交互,http编程也是必要的,将详细介绍http编程,用户注册,登录,后台接口请求等知识;通过第五、六章的学习,将会是你的Qt开发技术更上一层楼。第七章:介绍Qt并发编程,耗时任务处理,进程调用等知识。第八、九章:讲解 Qt 比较重要的知识,图形视图结构,以及MVD模式;通过这两章的学习,大家会对图形视图有更好的了解。第十章:本章是独立章节,主要介绍Qt中一些特殊技巧,项目编译,dpi适配、多语言等知识。第十一章:是我们的企业级项目实战:实现一个视频会议客户端,本项目可以进行多人视频通话,直播,桌面分享等功能,本项目我会从零开始,进行项目搭建,功能调试,bug fixed, 带领大家做一个企业级项目。希望通过本课程的学习,大家的C++ Qt开发技术能有质的飞越,能找到自己心仪的工作。课程中如果讲的不对的地方,请大家指出,我及时修正,我也只是一个普通开发者,也不是所有的技术都会,尽我所能,把我所会的教给大家,让我们一起为Qt的发展,尽一份绵薄之力。 下面是本课程一些项目的截图: 1 可以滑动的设置界面         2 所有图形的绘制       3 视频播放器          4 高仿youku界面         5 视频会议         相信通过本课程的学习,大家有能力实现绝大部分客户端项目,从此用C++ Qt再也不会有难写的界面

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值