• QT-简易视频播放器


      一直没找到理由去学一下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 <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,虽然兴趣不大,如果需要的话还是得学一下),整体上算是嵌入式软件开发的方方面面都涉猎了。

      

  • 相关阅读:
    js:值类型/引用类型/内存回收/函数传值
    JS学习计划
    起点
    哈夫曼压缩/解压缩(控制台,C++)
    二维数组作为函数参数传递(C++)
    二级指针和指针引用函数传参(C++)
    学生管理系统(C++,控制台,文件读取,姓名排序)
    C++的getline()和get()函数
    二叉排序树节点的删除(C++,算法导论),前中后序遍历(递归/非递归,栈实现),按层次遍历(队列实现)
    QT程序打包成EXE
  • 原文地址:https://www.cnblogs.com/zhangyi-studio/p/8596837.html
Copyright © 2020-2023  润新知