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