QT-简易视频播放器

时间:2021-05-18 19:48:02

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

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

  首先是ui:

    QT-简易视频播放器

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

  然后是使用时的状态:

    QT-简易视频播放器

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

  下面上代码:

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

 1 //头文件
 2 #ifndef MULPLAYER_H
 3 #define MULPLAYER_H
 4 
 5 #include <QMainWindow>
 6 #include <QVideoWidget>
 7 #include <QMediaPlayer>
 8 #include <QFileDialog>
 9 #include <QMediaPlaylist>
10 
11 namespace Ui {
12 class MulPlayer;
13 }
14 
15 class MulPlayer : public QMainWindow
16 {
17     Q_OBJECT
18 
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 <QBoxLayout>
  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 <QApplication>
 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,虽然兴趣不大,如果需要的话还是得学一下),整体上算是嵌入式软件开发的方方面面都涉猎了。