QT-簡易視頻播放器

  一直沒找到理由去學一下QT,因爲工做緣由以後的工做內容會用到QT,因而這兩天摸索了下;早上臨時決定先作個視頻播放器玩一下,因而先用qml發現不會用,無果,因而放棄了使用qml,等以後系統的看一下JavaScript以後再試試qml吧;今天用的是較爲傳統的C++加ui文件完成,c++算是個人編程母語,用起來更順手,作起來相對順利不少,用示例程序做參考,開始作本身的視頻播放器;至於ui文件用不用其實關係不大,控件佈局這一塊感受用C++直接作自由性更大。linux

  以上是背景,下邊開始講述具體的內容。c++

  首先是ui:編程

    

    全是使用QTdesigner自帶的控件,用到四個QPushButton、1個水平QSliderBar、上面空白部分有個QVideoWidget(控件編輯中沒有,用代碼生成的)。ide

  而後是使用時的狀態:函數

    

    只實現了最簡單的打開文件、播放、中止、全屏(其他功能後續有空再作)。。。因此叫簡單視頻播放器。佈局

  下面上代碼:學習

    包含了必需組件,槽函數只作了打開、播放、中止、全屏四個。ui

 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 組件上顯示,並用信號與槽機制實現簡單的控制流程。下面實現邏輯:this

  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實例並運行。url

 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,雖然興趣不大,若是須要的話仍是得學一下),總體上算是嵌入式軟件開發的方方面面都涉獵了。

相關文章
相關標籤/搜索