閱讀633 返回首頁    go 阿裏雲 go 技術社區[雲棲]


使用Qt做一個簡易音樂播放器[Phonon淺談--續]


2010-2-13 使用Qt做一個簡易音樂播放器【Phonon淺談--續】

 

在第一篇Phonon淺談中提及到了Phonon這個多媒體框架的一些基本知識,於是想著結合這些基本知識來實踐一番,做一個簡單的音樂播放器。

 

【步驟一】

新建一個Qt Gui工程,在建立過程中需要包含Phonon模塊,之後生成文件如下圖:

Qt Gui工程會生成一個ui文件,在這裏是mainwindow.ui。雙擊mainwindow.ui進行一番簡單的布局,如下圖:

關於這個ui界麵,中央位置是一個QListWidget,用來顯示音樂文件列表;下麵一欄紅色矩形是一個QVBoxLayout垂直布局部件,用來確定等會要建立的播放進度條的位置;而下麵則是四個相關控製按鈕。

大概地說,Phonon的工作機製是使用MediaObject來管理MediaSource即源文件,通過Path連接到AudioOutput,最後是由AudioOutput將數據發送到相關物理設備。

於是有了步驟二。

 

【步驟二】

步驟一是用來實現基本的界麵,而步驟二是用代碼實現具體的功能。

基於對Phonon的認識,有了以下四點:

使用MediaObject管理媒體源

使用AudioOutput連接物理設備

使用SeekSlider實現進度條

使用QList實現播放列表

於是產生了相應的代碼:

Phonon::MediaObject *mediaObject; Phonon::AudioOutput *audioOutput; Phonon::SeekSlider *seekSlider; QList<Phonon::MediaSource> sourceList;//播放列表

並且需要在構造函數裏麵將 mediaObject audioOutput 連接起來:

Phonon::createPath(mediaObject, audioOutput);

從而使得數據能從 mediaObject 到達 audioOutput ,再通過物理設備播放。

 

1、  要播放音樂首先需要有源文件,所以先實現添加文件的功能。

首先,將添加按鈕和添加功能連接起來:

connect(this->ui->addBtn, SIGNAL(clicked()), this, SLOT(addFiles()));

              從而實現點擊按鈕激活相應操作的功能,而添加音樂文件的槽的代碼如下:

void MainWindow::addFiles(){ QStringList files = QFileDialog::getOpenFileNames(this, tr("Selec Files to play")); QString file; foreach(file, files){ this->ui->listWidget->addItem(file); sourceList.append(file); } }

上述代碼是使用 QFileDialog getOpenFileNames 方法獲取若幹個音樂文件,然後再使用 Qt 中的 foreach 遍曆每個選中的文件,將其添加到播放列表中。

2、  播放、暫停和停止的基本實現

同樣的先將信號和槽連接起來:

connect(this->ui->playBtn, SIGNAL(clicked()), this, SLOT(playFile())); connect(this->ui->pauseBtn, SIGNAL(clicked()), this, SLOT(pauseFile())); connect(this->ui->stopBtn, SIGNAL(clicked()), this, SLOT(stopFile()));

              之後再具體實現相應的簡單功能,這裏列出 playFile 的代碼:

void MainWindow::playFile(){ if(sourceList.isEmpty()){ QMessageBox::information(this, tr("no music files"), tr("no files to play")); return ; } mediaObject->setQueue(sourceList); mediaObject->play(); this->ui->playBtn->setEnabled(false); this->ui->pauseBtn->setEnabled(true); }

首先判斷列表是否為空,接著設置播放隊列,然後播放當前文件,最後使得播放按鈕不可用,而激活暫停按鈕。其它的功能類似,都是使用 mediaObject 的方法。

 

【步驟三】

這裏隻簡單地實現播放功能,當然還是可以再繼續擴展功能,不過這是後話了。

運行的效果圖如下:

此時就能聽見蠻好聽的《左邊》了^_^

 

以下是全部代碼:

mainwindow.h:

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <Phonon> #include <QList> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); protected: void changeEvent(QEvent *e); private slots: void addFiles(); void playFile(); void pauseFile(); void stopFile(); private: Ui::MainWindow *ui; Phonon::MediaObject *mediaObject; Phonon::AudioOutput *audioOutput; Phonon::SeekSlider *seekSlider; QList<Phonon::MediaSource> sourceList;//播放列表 }; #endif // MAINWINDOW_H

mainwindow.cpp:

#include <QtGui> #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); connect(this->ui->addBtn, SIGNAL(clicked()), this, SLOT(addFiles())); connect(this->ui->playBtn, SIGNAL(clicked()), this, SLOT(playFile())); connect(this->ui->pauseBtn, SIGNAL(clicked()), this, SLOT(pauseFile())); connect(this->ui->stopBtn, SIGNAL(clicked()), this, SLOT(stopFile())); mediaObject = new Phonon::MediaObject(this); audioOutput = new Phonon::AudioOutput(this); seekSlider = new Phonon::SeekSlider(this); Phonon::createPath(mediaObject, audioOutput); seekSlider->setMediaObject(mediaObject); this->ui->seekLayout->addWidget(seekSlider); } MainWindow::~MainWindow() { delete ui; } void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void MainWindow::addFiles(){ QStringList files = QFileDialog::getOpenFileNames(this, tr("Selec Files to play")); QString file; foreach(file, files){ this->ui->listWidget->addItem(file); sourceList.append(file); } } void MainWindow::playFile(){ if(sourceList.isEmpty()){ QMessageBox::information(this, tr("no music files"), tr("no files to play")); return ; } mediaObject->setQueue(sourceList); mediaObject->play(); this->ui->playBtn->setEnabled(false); this->ui->pauseBtn->setEnabled(true); } void MainWindow::pauseFile(){ mediaObject->pause(); this->ui->pauseBtn->setEnabled(false); this->ui->playBtn->setEnabled(true); } void MainWindow::stopFile(){ mediaObject->stop(); this->ui->pauseBtn->setEnabled(true); this->ui->playBtn->setEnabled(true); }

main.cpp:

#include <QtGui/QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }

 

最後更新:2017-04-02 04:01:46

  上一篇:go Linux erron常量
  下一篇:go 關於定義一個指針與指針變量