昨天歷經千辛萬苦,配置好了VS 2010中的Qt環境(包括Qt for VS插件),今天決定淺淺地品味一下將兩者結合進行編程的魅力。
上網查了一些資料,學習了一些基礎知識,決定做一個簡單的音樂播放器,主要用到Phonon多媒體框架。
Phonon的工作機制:
使用MediaObject來管理MediaSource即源文件,通過Path連接到AudioOutput,最后是由AudioOutput將數據發送到相關物理設備。
1、新建一個工程:文件->新建->項目:
選擇Qt Application,本人命名為Player1;
*注意在此過程一定要把Phonon庫選上:


2、創建好項目以后,可以看到VS自動生成了很多文件,先不用管它們:

1)雙擊Form目錄下的player1.ui,進行控件的添加:

說明,從上到下分別是:
一個ListWeight(名:listWidget),
一個VerticalLayout(名:verticalLayout),
四個PushButton(名:addBtn,playBtn,pauseBtn,stopBtn)。
當然,各種屬性可以自行設置及更改(顏色,大小等);
2)此時,需要的控件已添加完畢,可以保存,並回到VS主頁對其進行右擊->編譯,ui_player1.h文件得到完善;
3、接下來就是各控件對應功能的實現,並進行信號與槽的連接:
1)先來看頭文件"player1.h",類的名稱在項目創建過程中也可以進行更改(默認為:項目名稱+Class):
#ifndef PLAYER1_H
#define PLAYER1_H
#include <QMainWindow>
#include <Phonon>
#include <QList>
#include "ui_player1.h"
class Player1Class : public QMainWindow
{
Q_OBJECT
public:
Player1Class(QWidget *parent = 0);
~Player1Class();
protected:
void changeEvent(QEvent *e);
private slots:
void addFiles();
void playFile();
void pauseFile();
void stopFile();
private:
Ui::Player1Class *ui;
Phonon::MediaObject *mediaObject;
Phonon::AudioOutput *audioOutput;
Phonon::SeekSlider *seekSlider;
QList<Phonon::MediaSource> sourceList;//播放列表
};
#endif //PLAYER1_H
2)源文件"player1.cpp":
#include <QtGui>
#include "player1.h"
#include "ui_player1.h"
Player1Class::Player1Class(QWidget *parent) :
QMainWindow(parent),ui(new Ui::Player1Class)
{
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->verticalLayout->addWidget(seekSlider);
}
Player1Class::~Player1Class()
{
delete ui;
}
void Player1Class::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type())
{
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void Player1Class::addFiles()
{
QStringList files = QFileDialog::getOpenFileNames(this, tr("Select Files to play"));
QString file;
foreach(file, files)
{
this->ui->listWidget->addItem(file);
sourceList.append(file);
}
}
void Player1Class::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 Player1Class::pauseFile()
{
mediaObject->pause();
this->ui->pauseBtn->setEnabled(false);
this->ui->playBtn->setEnabled(true);
}
void Player1Class::stopFile()
{
mediaObject->stop();
this->ui->pauseBtn->setEnabled(true);
this->ui->playBtn->setEnabled(true);
}
3)主函數文件"main.cpp":
#include <QtGui/QApplication>
#include "player1.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Player1Class w;
w.show();
return a.exec();
}
4、至此,便可以進行整個項目的編譯、運行,結果為:

一首張宇的"給你們"先給大家。謝謝!
