博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT-简易视频播放器
阅读量:6331 次
发布时间:2019-06-22

本文共 4815 字,大约阅读时间需要 16 分钟。

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

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

  首先是ui:

    

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

  然后是使用时的状态:

    

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

  下面上代码:

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

1 //头文件 2 #ifndef MULPLAYER_H 3 #define MULPLAYER_H 4  5 #include 
6 #include
7 #include
8 #include
9 #include
10 11 namespace Ui {12 class MulPlayer;13 }14 15 class MulPlayer : public QMainWindow16 {17 Q_OBJECT18 19 public:20 explicit MulPlayer(QWidget *parent = 0);21 ~MulPlayer();22 void addToPlaylist(const QStringList& fileNames);23 private:24 Ui::MulPlayer *ui;25 QMediaPlayer *player;26 QVideoWidget *videoWidget;27 QMediaPlaylist *Playlist;28 QString m_fileName;29 QMediaPlayer::State m_playerState;30 31 private slots:32 void openFile();33 void playVideo();34 void stopVideo();35 void fullScr();36 };37 38 #endif // MULPLAYER_H

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

1 #include "mulplayer.h"  2 #include "ui_mulplayer.h"  3 #include 
4 5 MulPlayer::MulPlayer(QWidget *parent) : 6 QMainWindow(parent), 7 ui(new Ui::MulPlayer), 8 m_playerState(QMediaPlayer::StoppedState) 9 { 10 ui->setupUi(this); 11 12 //MainWindow自带layout,所以需要自定义layout并把它设置成中心layout 13 //否则将会出现不能设置layout错误 14 QWidget *widget = new QWidget; 15 this->setCentralWidget(widget); 16 17 player = new QMediaPlayer; 18 19 Playlist = new QMediaPlaylist(); 20 player->setPlaylist(Playlist); 21 22 videoWidget = new QVideoWidget(widget); 23 player->setVideoOutput(videoWidget); 24 ui->progressBar->setRange(0, player->duration() / 1000); 25 26 //水平布局,控制按钮 27 QBoxLayout *ctlLayout = new QHBoxLayout; 28 ctlLayout->addWidget(ui->openFileBtn); 29 ctlLayout->addWidget(ui->playBtn); 30 ctlLayout->addWidget(ui->stopBtn); 31 ctlLayout->addWidget(ui->fullScrBtn); 32 33 //垂直布局:视频播放器、进度条、控制按钮布局 34 QBoxLayout *mainLayout = new QVBoxLayout; 35 mainLayout->addWidget(videoWidget); 36 mainLayout->addWidget(ui->progressBar); 37 mainLayout->addLayout(ctlLayout); 38 39 //设置布局 40 widget->setLayout(mainLayout); 41 42 43 //信号槽 44 QObject::connect(ui->openFileBtn,SIGNAL(clicked()),this,SLOT(openFile())); 45 QObject::connect(ui->playBtn,SIGNAL(clicked()),this,SLOT(playVideo())); 46 QObject::connect(ui->stopBtn,SIGNAL(clicked()),this,SLOT(stopVideo())); 47 QObject::connect(ui->fullScrBtn,SIGNAL(clicked()),this,SLOT(fullScr())); 48 } 49 50 MulPlayer::~MulPlayer() 51 { 52 delete ui; 53 } 54 55 void MulPlayer::openFile() 56 { 57 QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Open Files")); 58 addToPlaylist(fileNames); 59 } 60 61 void MulPlayer::playVideo() 62 { 63 m_playerState = QMediaPlayer::PlayingState; 64 player->play(); 65 } 66 67 void MulPlayer::stopVideo() 68 { 69 m_playerState = QMediaPlayer::StoppedState; 70 player->stop(); 71 } 72 73 void MulPlayer::fullScr() 74 { 75 if(m_playerState == QMediaPlayer::PlayingState) 76 { 77 videoWidget->setFullScreen(true); 78 } 79 else 80 { 81 videoWidget->setFullScreen(false); 82 } 83 84 } 85 86 void MulPlayer::addToPlaylist(const QStringList& fileNames) 87 { 88 foreach (QString const &argument, fileNames) { 89 QFileInfo fileInfo(argument); 90 if (fileInfo.exists()) { 91 QUrl url = QUrl::fromLocalFile(fileInfo.absoluteFilePath()); 92 if (fileInfo.suffix().toLower() == QLatin1String("m3u")) { 93 Playlist->load(url); 94 } else 95 Playlist->addMedia(url); 96 } else { 97 QUrl url(argument); 98 if (url.isValid()) { 99 Playlist->addMedia(url);100 }101 }102 }103 }

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

1 #include "mulplayer.h" 2 #include 
3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 MulPlayer w; 8 w.show(); 9 10 return a.exec();11 }

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

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

  

 

转载于:https://www.cnblogs.com/zhangyi-studio/p/8596837.html

你可能感兴趣的文章
SQL语言基础
查看>>
对事件处理的错误使用
查看>>
最大熵模型(二)朗格朗日函数
查看>>
深入了解setInterval方法
查看>>
html img Src base64 图片显示
查看>>
[Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction...
查看>>
FFMPEG中关于ts流的时长估计的实现(转)
查看>>
Java第三次作业
查看>>
【HDOJ 3652】B-number
查看>>
android代码混淆笔记
查看>>
Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction 并查集
查看>>
BMP文件的读取与显示
查看>>
Flash文字效果
查看>>
各种排序算法总结篇(高速/堆/希尔/归并)
查看>>
使用c#訪问Access数据库时,提示找不到可安装的 ISAM
查看>>
Highcharts X轴纵向显示
查看>>
windows 注册表讲解
查看>>
【算法】论平衡二叉树(AVL)的正确种植方法
查看>>
基于DDD的现代ASP.NET开发框架--ABP系列之1、ABP总体介绍
查看>>
【原】东拼西凑PBR(1):PBR基础
查看>>