一直没找到理由去学一下QT,由于工作原因之后的工作内容会用到QT,于是这两天摸索了下;早上临时决定先做个视频播放器玩一下,于是先用qml发现不会用,无果,于是放弃了使用qml,等之后系统的看一下JavaScript之后再试试qml吧;今天用的是较为传统的C++加ui文件完成,c++算是我的编程母语,用起来更顺手,做起来相对顺利很多,用示例程序作参考,开始做自己的视频播放器;至于ui文件用不用其实关系不大,控件布局这一块感觉用C++直接做自由性更大。

  以上是背景,下边开始讲述具体的内容。

简易ui:

    

    全是使用QTdesigner自带的控件,用到四个QPushButton、1个水平QSliderBar、上面空白部分有个QVideoWidget(控件编辑中没有,用代码生成的)。

使用时的状态:

    

    只实现了最简单的打开文件、播放、停止、全屏(其余功能后续有空再做)。。。所以叫简单视频播放器。

代码:

    包含了必需组件,槽函数只做了打开、播放、停止、全屏四个。

 //头文件
#ifndef MULPLAYER_H
#define MULPLAYER_H #include <QMainWindow>
#include <QVideoWidget>
#include <QMediaPlayer>
#include <QFileDialog>
#include <QMediaPlaylist> namespace Ui {
class MulPlayer;
} class MulPlayer : public QMainWindow
{
Q_OBJECT public:
explicit MulPlayer(QWidget *parent = );
~MulPlayer();
void addToPlaylist(const QStringList& fileNames);
private:
Ui::MulPlayer *ui;
QMediaPlayer *player;
QVideoWidget *videoWidget;
QMediaPlaylist *Playlist;
QString m_fileName;
QMediaPlayer::State m_playerState; private slots:
void openFile();
void playVideo();
void stopVideo();
void fullScr();
}; #endif // MULPLAYER_H

    具体实现思路是用QMediaPlayer提供的相关接口取得文件,之后在 QVideoWidget 组件上显示,并用信号与槽机制实现简单的控制流程。下面实现逻辑:

 #include "mulplayer.h"
#include "ui_mulplayer.h"
#include <QBoxLayout> MulPlayer::MulPlayer(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MulPlayer),
m_playerState(QMediaPlayer::StoppedState)
{
ui->setupUi(this); //MainWindow自带layout,所以需要自定义layout并把它设置成中心layout
//否则将会出现不能设置layout错误
QWidget *widget = new QWidget;
this->setCentralWidget(widget); player = new QMediaPlayer; Playlist = new QMediaPlaylist();
player->setPlaylist(Playlist); videoWidget = new QVideoWidget(widget);
player->setVideoOutput(videoWidget);
ui->progressBar->setRange(, player->duration() / ); //水平布局,控制按钮
QBoxLayout *ctlLayout = new QHBoxLayout;
ctlLayout->addWidget(ui->openFileBtn);
ctlLayout->addWidget(ui->playBtn);
ctlLayout->addWidget(ui->stopBtn);
ctlLayout->addWidget(ui->fullScrBtn); //垂直布局:视频播放器、进度条、控制按钮布局
QBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(videoWidget);
mainLayout->addWidget(ui->progressBar);
mainLayout->addLayout(ctlLayout); //设置布局
widget->setLayout(mainLayout); //信号槽
QObject::connect(ui->openFileBtn,SIGNAL(clicked()),this,SLOT(openFile()));
QObject::connect(ui->playBtn,SIGNAL(clicked()),this,SLOT(playVideo()));
QObject::connect(ui->stopBtn,SIGNAL(clicked()),this,SLOT(stopVideo()));
QObject::connect(ui->fullScrBtn,SIGNAL(clicked()),this,SLOT(fullScr()));
} MulPlayer::~MulPlayer()
{
delete ui;
} void MulPlayer::openFile()
{
QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open Files"));
addToPlaylist(fileNames);
} void MulPlayer::playVideo()
{
m_playerState = QMediaPlayer::PlayingState;
player->play();
} void MulPlayer::stopVideo()
{
m_playerState = QMediaPlayer::StoppedState;
player->stop();
} void MulPlayer::fullScr()
{
if(m_playerState == QMediaPlayer::PlayingState)
{
videoWidget->setFullScreen(true);
}
else
{
videoWidget->setFullScreen(false);
} } void MulPlayer::addToPlaylist(const QStringList& fileNames)
{
foreach (QString const &argument, fileNames) {
QFileInfo fileInfo(argument);
if (fileInfo.exists()) {
QUrl url = QUrl::fromLocalFile(fileInfo.absoluteFilePath());
if (fileInfo.suffix().toLower() == QLatin1String("m3u")) {
Playlist->load(url);
} else
Playlist->addMedia(url);
} else {
QUrl url(argument);
if (url.isValid()) {
Playlist->addMedia(url);
}
}
}
}

  下面是main函数,在QT中main的作用相对简单,就是创建APP实例并运行。

 #include "mulplayer.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MulPlayer w;
w.show(); return a.exec();
}

  以上便是全部代码,非常简洁;当然如果觉得系统UI太丑,想要实现类似于QQ这种界面,就得自己实现一些控件类;QT提供了非常全的各种库,日常使用足够了。

  开始了QT的学习,这也算是我整个学习计划中的一环吧,目前为止已研究过uboot、linux系统部分源码、linux模块驱动编程;并且我目前工作的内容是嵌入式应用开发,再加上QT这种偏UI的编程(QT中引入的QML简直就是JavaScript,虽然兴趣不大,如果需要的话还是得学一下),整体上算是嵌入式软件开发的方方面面都涉猎了。

  

QT-简易视频播放器的更多相关文章

  1. C语言基于GTK+Libvlc实现的简易视频播放器(二)

    简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显 示视频播放进度,但即使作为一个视频播放器,只有这 ...

  2. C语言基于GTK+Libvlc实现的简易视频播放器

    小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易 ...

  3. 【Harmony OS】【ArkUI】ets开发 简易视频播放器

    ​前言:这一次我们来使用ets的Swiper组件.List组件和Video组件制作一个简易的视频播放器.本篇是以HarmonyOS官网的codelab简易视频播放器(eTS)为基础进行编写.本篇最主要 ...

  4. 简易视频播放器2 (基于Qt、opencv)

    因项目需要,需要实现一个对以保存的监测视频快速查看功能. 查询网上一些资料,初步简易的实现了一下. 实际效果图: 该程序基于Qt5.4,opencv248,开发环境为win8.1 结构为: video ...

  5. Qt编写视频播放器(vlc内核)

    在研究qt+vlc的过程中,就想直接做个播放器用于独立的项目,vlc还支持硬件加速,不过部分电脑硬件不支持除外.用vlc的内核写播放器就是快,直接调用api就行,逻辑处理和ui展示基本上分分钟的事情, ...

  6. FFmpeg简易播放器的实现-视频播放

    本文为作者原创:https://www.cnblogs.com/leisure_chn/p/10047035.html,转载请注明出处 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  7. FFmpeg简易播放器的实现-音视频播放

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10235926.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  8. FFmpeg简易播放器的实现-音视频同步

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  9. FFmpeg简易播放器的实现-音频播放

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10068490.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  10. FFmpeg简易播放器的实现-最简版

    本文为作者原创:https://www.cnblogs.com/leisure_chn/p/10040202.html,转载请注明出处 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

随机推荐

  1. 自己动手写java锁

    1.LockSupport的park和unpark方法的基本使用,以及对线程中断的响应性 LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语.java锁和同步器 ...

  2. Microsoft SQL Server 【Windows 身份验证】和 【sa】都无法登录的解决方案

    1.修改启动参数:打开[SQL Server 配置管理器(SQL Server Configuration Manager)]→右键[SQL Server(MSSQLSERVER)]属性→高级(Adv ...

  3. CCF CSP 201503-1 图像旋转 (降维)

    题目链接:http://118.190.20.162/view.page?gpid=T27 问题描述 试题编号: 201503-1 试题名称: 图像旋转 时间限制: 5.0s 内存限制: 256.0M ...

  4. Linux高效数据统计命令wc

    wc(world count)是一个统计文件字词,字节,行数的命令,它可以帮我们非常方便的统计以上信息. 主要参数 常见参数如下: -c 统计字节数. -l 统计行数. -m 统计字符数.这个标志不能 ...

  5. WindowsService调用API

    本文着重于WindowsServic如何调用API以及出现部分问题的解决方案 本文Windows Service 创建摘自JasperXu的博客   链接:http://www.cnblogs.com ...

  6. zabbix监控服务搭建

    命令配置 浏览器配置: 检查必须全部ok(若有warning,检查是否漏装包,重启php-fpm服务) 数据库信息 主机名(zabbix server ip).端口号(默认).名字(随意) 配置摘要 ...

  7. Exp6 信息搜集与漏洞扫描 20164303

    一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容. (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测. ...

  8. Java中日期格式(String、Date、Calendar)的相互转换

    package day20190318; import java.text.ParseException; import java.text.SimpleDateFormat; import java ...

  9. 【JavaScript】标准日期、中国标准时间、时间戳、毫秒数互转

    转载自:https://blog.csdn.net/IT429/article/details/78341847 看到的一篇比较有用的前端js时间转换方法,留个备份 首先要明确这三种格式是什么样子的: ...

  10. Python线程模块threading

    线程,程序执行的最小单元,单线程处理多个任务只能一个处理完后继续处理下一个直到全部处理完,多线程处理任务会比单线程处理起来快吗?在python程序里得看情况,首先有GIL锁的存在导致同一时刻只能有一个 ...