使用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