使用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 实现播放列表

于是产生了相应的代码:

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

并且需要在构造函数里面将 mediaObject 和 audioOutput 连接起来:

view plaincopy to clipboardprint?
Phonon::createPath(mediaObject, audioOutput); 
    Phonon::createPath(mediaObject, audioOutput);


从而使得数据能从 mediaObject 到达 audioOutput ,再通过物理设备播放。

 

1、  要播放音乐首先需要有源文件,所以先实现添加文件的功能。

首先,将添加按钮和添加功能连接起来:

view plaincopy to clipboardprint?
connect(this->ui->addBtn, SIGNAL(clicked()), this, SLOT(addFiles())); 
connect(this->ui->addBtn, SIGNAL(clicked()), this, SLOT(addFiles()));


              从而实现点击按钮激活相应操作的功能,而添加音乐文件的槽的代码如下:

view plaincopy to clipboardprint?
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::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、  播放、暂停和停止的基本实现

同样的先将信号和槽连接起来:

view plaincopy to clipboardprint?
    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())); 
    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 的代码:

view plaincopy to clipboardprint?
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::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:

view plaincopy to clipboardprint?
#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 
#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:

view plaincopy to clipboardprint?
#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);  

#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:

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


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jasonblog/archive/2010/02/13/5308197.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章