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();    //启动,无设置视频名情况下失败返回0bool pause();bool stop();    //关闭,无播放情况下失败返回0void 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);
}

qt视频播放界面类设计相关推荐

  1. 使用QT设计师界面类创建2个界面,通过按键从界面1切换到界面2

    思路:按钮点击函数hide窗口1同时emit广播点击信号(自己加),main使用connect,窗口1发出点击信号,运行窗口2show显示函数 步骤一:Add new--QT--设计师界面类 步骤二: ...

  2. 把Qt的界面文件(.ui文件)生成源文件(.h或.cpp)封装成链接库

    前言 在用Qt做开发时,为了方便快速,一般都使用Qt设计师界面类来做界面相关的布局,这个类在当前工程中是没有.cpp或.h文件的,但主类又有引入了这个头文件,点开转到定义或声明时,是打不开的,如下图: ...

  3. QT 网络聊天室设计实验报告

    一.实验目的与要求 (1)了解QT Network模块基本知识 (2)掌握网络访问接口的方法 (3)熟悉获取网络接口信息的方法 二.实验内容与安排方式 (1)了解QT Network模块基本知识 (2 ...

  4. QT实时视频播放界面设计

    QT播放界面设计 今天写了个QT的实时视频播放界面,其实要写一个播放界面非常容易,以下为代码 首先定义一个用于播放的控件: * PlsyItem.h #ifndef PLAYITEM_H #defin ...

  5. QT入门之UI设计界面

    QT入门之UI设计界面 在UI设计界面中,可以观察到属性编辑器实际上就是对派生类的各个成员数据进行赋值.因为QLineEdit继承自QWidget,QWidget又继承自QObject,所以可以看出属 ...

  6. QT常见界面设计组件——QTreeWidget和QDockWidget

    实例概述 此实例主要介绍QTreeWidget.QDockWidget的使用,以及用QLabel显示图片的方法,实例主要使用QTreeWidget,创建一个照片管理器,实例运行界面效果如下: 此实例的 ...

  7. qt版——操作系统课程设计(含可视化界面)

    ** 需要完整项目源代码的同志,可以通过QQ邮箱与我联系:1308269670@qq.com ** 项目总结 一. 设计思路: 界面设计如下: 主要的设计思路就是利用按钮,在用户点击后弹出相关功能窗口 ...

  8. FFmpeg开发(五)——Qt视频播放器之封装FFmpeg类(参考了暴风影音、迅雷影音)

    FFmpeg开发(五)--Qt视频播放器之封装FFmpeg类(参考了暴风影音.迅雷影音) 上一篇介绍了,使用Qt和FFmpeg写的播放器.页面大家可以点进去查看和下载. FFmpeg开发(四)--Qt ...

  9. 【Qt编程】基于Qt的词典开发系列六--界面美化设计

    本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...

最新文章

  1. lambda在python中的用法_在python中对lambda使用.assign()方法
  2. 平行志愿遵循分数优先php,2015年黑龙江普通高校招生平行志愿“平行志愿”投档录取模式有哪些优点?...
  3. 数据蒋堂 | JOIN延伸 - 维度概念
  4. 阅读笔记1(面试题功能测试-自动化提升效率)
  5. UnrealEngine4 - 关于UObject被自动GC垃圾回收的巨坑
  6. 诺基亚继续打情怀牌:怀旧小屏手机入网!
  7. 资料下载:敏捷个人的成长思考.pptx(第1次线下活动2011.04)
  8. 提示账户不被允许使用docker的情况
  9. Windows Notepad 居然要迎来大更新了!
  10. 怎样有效地推广APP
  11. Epub360、iH5、Mugeda,三款专业级H5设计工具详评
  12. oier必备的博客和OJ
  13. UNL系列图——交互图
  14. django后台搜索显示Related Field got invalid lookup: icontains
  15. 传统防火墙与Web应用程序防火墙(WAF)的区别
  16. nodejs express搭建服务器(爬虫知乎精华帖,个人学习用)六 在express中建立路由
  17. 【案例】中国太平保险构建大数据报表平台系统
  18. Java 照片墙_js实现照片墙功能实例
  19. rm -rf / 好屌!
  20. 如何使用Workless(源码下载)做积分管理?

热门文章

  1. 宫崎骏:纵有疾风起,人生不言弃。
  2. 浅谈国产ERP的“横纵竖”三向发展态势
  3. Au:改变音频持续时间
  4. Installing the Jupyter Software
  5. sqlserver linux 付费吗_9 款 Linux 上的最佳笔记应用 | Linux 中国
  6. turtle风轮绘制(turtle库初学)
  7. Oracle 19c OCP认证考试软件清单
  8. 换中国电信卡显示无服务器,用5G或需要换SIM卡 中国电信给出了答案
  9. 在linux中的vi中的删除操作,linux中vi和vim操作
  10. 信息安全等级保护划分五级及等保级别适用行业...