花了两个礼拜的时间在qt平台上做了一个中等的音乐播放器,以下是一些.cpp和.h文件仅供参考,这个播放器还有一些功能需要完善,比如说显示歌词,上网搜索歌曲等等。在整个播放器的制作过程当中,首先需要了解一下一个音乐播放器需要用到哪些模块,比如说资源管理器,音乐信息对象,物理连接设备等等,分清楚这些模块它们各自的功能,然后再开始做,这样要稍微容易一些。有一个问题需要注意一下,虽然说这是一个小小的问题,但也花了我几天的时间,问题就是在新建的pro里面没有加phonon,因为音乐播放器在播放歌曲的时候需要phonon对歌曲进行解析,才可以播放,所以值得注意。
主窗口加列表截图如下:
如下是widget.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include "musiclist.h"
#include <QTime>
#include <QUrl>
#include <QtGlobal>
#include <QtGui>
int num = 0;
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); // 建立主窗口
// 一个音乐文件列表建立
list= new musiclist(this);
QString str = tr("播放列表"); // 设置窗口的名称
list->setWindowTitle(str); // 如果是这条代码(list->setWindowTitle("音乐播放器")),则会显示乱码
list->setFixedSize(285, 300); // 设置窗口的长和宽
list->installEventFilter(this); // object 事件过滤器,比如说是鼠标点击,移动等等
list->ui->tableWidget->installEventFilter(this);
list->ui->tableWidget->setColumnWidth(1, 100); // 调节第1列的宽度
list->ui->tableWidget->setColumnHidden(0, 100); // 调节第0列的宽度
readSettings(); // 读取主窗口和列表宽的位置
// 主窗口模块
QString str2 = tr("音乐播放器 (陈伟东制作)");
this->setWindowTitle(str2);
this->setFixedSize(280, 150);
this->ui->listWidget->setStyleSheet("background-image:url(images/3.jpg)"); // 添加背景图片,具体参考QT收藏资料,也可以使用另外一种方法
// 建立媒体管理
musicInformationMediaObject = new Phonon::MediaObject(this); // 音乐信息对象
mediaObject = new Phonon::MediaObject(this); // 分配一个资源管理器
audioOutput = new Phonon::AudioOutput(); // 有些时候是 audioOutput = new Phonon::AudioOutput(Phonon::VideoCategory),它的作用是将源文件映射到物理设备
Phonon::createPath(mediaObject, audioOutput); // 用creatPath函数将资源管理器和audioOutput连接起来
creation(); // 初始化歌曲器件,以及托盘menu的一些菜单
// 声音控制模块
volumeSlider = new Phonon::VolumeSlider(this); // 在主窗口里申请一个volumSlider
volumeSlider->setAudioOutput(audioOutput); // 使得音量控制器和音乐文件连接起来
volumeSlider->move(175, 130);
volumeSlider->resize(20, 20);
volumeSlider->setFixedWidth(90); //固定音量条宽度的大小
// 进度条控制及设置模块
seekSlider = new Phonon::SeekSlider(this); // 在主窗口中分配seekSlider 函数中的this必需得加上去,因为this代表主窗口的意思
seekSlider->setMediaObject(mediaObject); // 使得进度条和歌曲进度一致
seekSlider->move(2, 2); // 设置进度条在主窗口的哪个位置 做上角为(0,0)
seekSlider->resize(265, 20); // 设置进度条宽度
// 媒体状态发生变化时,有如下信号与槽的关系
connect(mediaObject, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(mediaObjectStateChanged(Phonon::State,Phonon::State)));
// 双击音乐音乐列表里面的音乐时使得点到的歌曲播放
connect(list->ui->tableWidget, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(tableWidget_cellDoubleClicked(int,int)));
// 音乐列表和主窗口里(列表)按钮的连接
connect(list, SIGNAL(listClose()), this->ui->toolButton, SLOT(toggle()));
// 在当前的歌曲快要播放完时
connect(mediaObject, SIGNAL(aboutToFinish()), this, SLOT(musicAboutToFinish()));
connect(mediaObject, SIGNAL(currentSourceChanged(Phonon::MediaSource)), this, SLOT(currentMusicSourceChanged(Phonon::MediaSource)));
// 当musicInformationMediaObject信息对象发生变化时,建立如下槽和信号的连接
connect(musicInformationMediaObject,SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(musicInformationStateChanged(Phonon::State,Phonon::State)));
// 音乐文件的时间显示与显示建立信号与槽的联系
connect(mediaObject,SIGNAL(tick(qint64)),this,SLOT(showTime(qint64)));
connect(this,SIGNAL(mySignal()),this,SLOT(close()),Qt::QueuedConnection);
}
Widget::~Widget()
{
delete ui;
}
void Widget::tableWidget_cellDoubleClicked(int row, int column) // 双击一首歌曲
{
mediaObject->stop();
mediaObject->clearQueue(); // clear the quenue of the media object
if (row > sourceList.size())
{
return;
}
mediaObject->setCurrentSource(sourceList.at(row)); // 设置mediaobject当前的歌曲
mediaObject->play();
}
void Widget::currentMusicSourceChanged(Phonon::MediaSource source) // 当自动播放下一曲音乐时,在tableWidget中让它为选中状态
{
list->ui->tableWidget->selectRow(sourceList.indexOf(source));
mediaObject->pause(); // 在此改变一下状态触发mediaObjectStateChanged槽函数
}
// 音乐信息变化时,比如说增加一些歌曲,或者是清空列表等等
void Widget::musicInformationStateChanged(Phonon::State newState,Phonon::State)
{
if (newState != Phonon::StoppedState && newState != Phonon::PausedStat