QT平台上制作的音乐播放器

花了两个礼拜的时间在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

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值