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