本次使用widget工程。
qt工程文件建议放在桌面处或c盘,以防qt工程没有权限访问图片和音乐等资源。工程内部的资源必然可以访问。
工程内的路径用/
,绝对路径用//
。
1、设置图标和标题
this->setWindowTitle("Test"); // 标题
this->setWindowIcon(QIcon(":/image/player.png")); // 应用图标
ui->pushButton_play->setIcon(QIcon(":/image/play.png")); // ui中该按钮设置图标
设置图片时,需要先导入资源文件。
UI界面需要手动更改名称。
2、设置音乐文件
首先在.pro文件中添加模块:
QT += core gui multimedia
定义指向音乐文件的指针:
#include <QMediaPlayer>
......
private:
Ui::Widget *ui;
QMediaPlayer p;
在cpp文件中设置音乐文件:
p.setMedia(QUrl::fromLocalFile("E:\\Test\\music\\告白气球.mp3"));
// p.play(); //启用时,可以播放
fromLocalFile即本地文件,一般音乐文件较大,无需加入资源文件,可用绝对路径引入。
此时设置play函数,即可播放音乐。
付费app的音乐可能无法解析,建议使用网络免费.mp3资源。
3、信号与槽
将操作与信号绑定。
public slots: //没有 元对象系统宏,就用不了信号和槽
void DurationChanged();
// 歌曲加载完毕,参数修改
connect(&p, &QMediaPlayer::durationChanged, this, &Widget::DurationChanged);
......
void Widget::DurationChanged()
{
// 获取 p->音乐 的长度(毫秒)
long long duration = p.duration(); // qint64 对应long long 类型
// 格式化字符,分:秒
QString Time = QString("%1:%2").arg(duration / 1000 / 60).arg(duration / 1000 % 60);
// 设置到对应标签
ui->label_MusicTime->setText(Time);
}
设置完成后,播放时可看到标签显示音乐长度。
4、暂停
public slots:
void PlayMusic();
connect(ui->pushButton_play, &QPushButton::clicked, this, &Widget::PlayMusic);
// 将pushButton_play按钮的clicked动作与this对象的PlayMusic方法绑定
......
void Widget::PlayMusic()
{
if(p.state() != QMediaPlayer::PlayingState) // 非播放状态
{
p.play();
ui->pushButton_play->setIcon(QIcon(":/image/pause.png")); // 可切换图标
}
else
{
p.pause();
ui->pushButton_play->setIcon(QIcon(":/image/play.png"));
}
}
设置完成后可点击按钮切换播放和暂停状态。
同理可设置当前时间:
public slots:
void PositionChanged();
connect(&p, &QMediaPlayer::positionChanged, this, &Widget::PositionChanged);
......
void Widget::PositionChanged()
{
long long position = p.position();
QString Time = QString("%1:%2").arg(position / 1000 / 60).arg(position / 1000 % 60);
ui->label_CurrentTime->setText(Time);
}
5、进度条
connect(ui->horizontalSlider, &QSlider::sliderMoved, &p, &QMediaPlayer::setPosition);
void Widget::DurationChanged()
{
long long duration = p.duration();
QString Time = QString("%1:%2").arg(duration / 1000 / 60).arg(duration / 1000 % 60);
ui->label_MusicTime->setText(Time);
// 设置进度条与音乐的对应范围
ui->horizontalSlider->setRange(0, static_cast<int>(duration));
// 直接用duration作为最大值,便于下面改变进度条位置时到达对应位置
}
void Widget::PositionChanged()
{
long long position = p.position();
QString Time = QString("%1:%2").arg(position / 1000 / 60).arg(position / 1000 % 60);
ui->label_CurrentTime->setText(Time);
// 绑定位置与音乐进度
ui->horizontalSlider->setValue(static_cast<int>(position));
// set系列应使用int,可使用静态数据转换
}
设置完成后,播放音乐时进度条会随之推进,而拖动进度条时,音乐进度也会随之改变。
如果出现文件错误,可能是头文件未识别,缺什么加什么即可:
#include <QIcon>
#include <QMediaPlayer>