昨天曆經千辛萬苦,配置好了VS 2010中的Qt環境(包括Qt for VS插件),今天決定淺淺地品味一下將二者結合進行編程的魅力。編程
上網查了一些資料,學習了一些基礎知識,決定作一個簡單的音樂播放器,主要用到Phonon多媒體框架。app
Phonon的工做機制:框架
使用MediaObject來管理MediaSource即源文件,經過Path鏈接到AudioOutput,最後是由AudioOutput將數據發送到相關物理設備。ide
一、新建一個工程:文件->新建->項目:函數
選擇Qt Application,本人命名爲Player1;學習
*注意在此過程必定要把Phonon庫選上:ui
二、建立好項目之後,能夠看到VS自動生成了不少文件,先不用管它們:this
1)雙擊Form目錄下的player1.ui,進行控件的添加:spa
說明,從上到下分別是:插件
一個ListWeight(名:listWidget),
一個VerticalLayout(名:verticalLayout),
四個PushButton(名:addBtn,playBtn,pauseBtn,stopBtn)。
固然,各類屬性能夠自行設置及更改(顏色,大小等);
2)此時,須要的控件已添加完畢,能夠保存,並回到VS主頁對其進行右擊->編譯,ui_player1.h文件獲得完善;
三、接下來就是各控件對應功能的實現,並進行信號與槽的鏈接:
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(); }
四、至此,即可以進行整個項目的編譯、運行,結果爲:
一首張宇的"給大家"先給你們。謝謝!