在Linux系统下,通过QT对multimedia库的使用,实现音乐播放器的功能,包括开始播放、暂停播放、继续播放、终止播放、播放上一首、播放下一首、添加指定目录下的音乐、删除指定歌曲、清空列表、进度调节、音量调节。应用到QFileDialog、QStringList等类。
界面效果如下图:
具体代码如下:
main.c
#include "player.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Player w;
w.show();
return a.exec();
}
player.h
#ifndef PLAYER_H
#define PLAYER_H
#include <QWidget>
#include <QFileDialog>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QListWidgetItem>
namespace Ui {
class Player;
}
class Player : public QWidget
{
Q_OBJECT
public:
explicit Player(QWidget *parent = 0);
~Player();
private slots:
void on_pushButton_close_clicked();
void on_pushButton_start_clicked();
void on_pushButton_add_clicked();
void on_listWidget_itemDoubleClicked();
void on_pushButton_stop_clicked();
void on_pushButton_prev_clicked();
void on_pushButton_next_clicked();
void on_pushButton_clear_clicked();
void on_pushButton_delete_clicked();
void set_sider(qint64 duration);
void set_value(qint64 position);
void on_horizontalSlider_sound_valueChanged(int value);
void on_horizontalSlider_speed_valueChanged(int value);
void on_horizontalSlider_speed_sliderMoved(int position);
private:
Ui::Player *ui;
//播放器
QMediaPlayer *mplayer;
//播放列表
QMediaPlaylist *playlist;
QString music_duration;
};
#endif // PLAYER_H
player.cpp
#include "player.h"
#include "ui_player.h"
#include <QDebug>
Player::Player(QWidget *parent) :
QWidget(parent),
ui(new Ui::Player)
{
ui->setupUi(this);
mplayer = new QMediaPlayer(this);
playlist = new QMediaPlaylist(this);
//设置播放模式
playlist->setPlaybackMode(QMediaPlaylist::Loop);
//设置播放器的播放列表
mplayer->setPlaylist(playlist);
ui->pushButton_stop->setEnabled(false); //失能暂停按钮
// this->setAutoFillBackground(true); //自定义背景
// QPalette palette = this->palette();
// palette.setBrush(QPalette::Window,QBrush(QPixmap("./background.jpeg"). //使用平滑的缩放方式
// scaled(this->size(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation)));
// this->setPalette(palette); //给widget加上背景图
//连接信号和槽
QObject::connect(mplayer,SIGNAL(durationChanged(qint64)),this,SLOT(set_sider(qint64)));
QObject::connect(mplayer,SIGNAL(positionChanged(qint64)),this,SLOT(set_value(qint64)));
}
Player::~Player()
{
delete ui;
}
void Player::on_pushButton_close_clicked() //终止播放
{
mplayer->stop(); //停止播放器
ui->pushButton_stop->setText("暂停");
ui->pushButton_stop->setEnabled(false); //失能暂停按钮
}
void Player::on_pushButton_start_clicked()
{
//指定当前播放文件
int row = ui->listWidget->currentRow();
playlist->setCurrentIndex(row);
//设置音量
mplayer->setVolume(ui->horizontalSlider_sound->value());
mplayer->play();
ui->pushButton_stop->setText("暂停"); //重置暂停按钮
ui->pushButton_stop->setEnabled(true); //使能暂停按钮
}
void Player::on_pushButton_add_clicked() //添加音乐
{
QStringList music_files = QFileDialog::getOpenFileNames(this,"选择音乐文件","./music","*.mp3 *.WAV");
for(int i = 0; i < ui->listWidget->count(); i++) //去重
{
for(int j = 0; j < music_files.count(); j++)
{
if(ui->listWidget->item(i)->text() == music_files.at(j))
{
music_files.removeAt(j);
break;
}
}
}
if(music_files.isEmpty()) //如果无添加文件,直接返回
return;
for(int i=0;i<music_files.count();i++) //添加到listWidget和playlist
{
QString file = music_files.at(i);
playlist->addMedia(QUrl::fromLocalFile(file)); //把文件加入播放列表
}
ui->listWidget->addItems(music_files); //将文件添加到listWidget
ui->listWidget->setCurrentRow(0); //定位
}
void Player::on_listWidget_itemDoubleClicked() //双击播放音乐
{
on_pushButton_start_clicked();
}
void Player::on_pushButton_stop_clicked() //暂停播放、继续播放音乐
{
if(ui->pushButton_stop->text() == "暂停")
{
ui->pushButton_stop->setText("继续");
mplayer->pause();
}
else
{
ui->pushButton_stop->setText("暂停");
mplayer->play();
}
}
void Player::on_pushButton_prev_clicked() //上一首
{
int row = ui->listWidget->currentRow();
if(row == 0)
row = ui->listWidget->count();
row--;
ui->listWidget->setCurrentRow(row);
on_pushButton_start_clicked();
}
void Player::on_pushButton_next_clicked() //下一首
{
int row = ui->listWidget->currentRow();
if(row == ui->listWidget->count()-1)
row = 0;
else
row++;
ui->listWidget->setCurrentRow(row);
on_pushButton_start_clicked();
}
void Player::on_pushButton_clear_clicked() //清空列表
{
on_pushButton_close_clicked();
ui->listWidget->clear();
}
void Player::on_pushButton_delete_clicked() //删除音乐
{
int row = ui->listWidget->currentRow();
QListWidgetItem *item = ui->listWidget->takeItem(row);
if(item)
{
delete item;
}
playlist->removeMedia(row);
on_pushButton_start_clicked();
}
//移动声音滑动条
void Player::on_horizontalSlider_sound_valueChanged(int value)
{
mplayer->setVolume(value);
ui->label_sound->setText(QString("音量:%1").arg(value)); //更新显示
}
//移动进度滑动条
void Player::on_horizontalSlider_speed_valueChanged(int value)
{
mplayer->setVolume(value);
}
//周期改变函数
void Player::set_sider(qint64 duration)
{
ui->horizontalSlider_speed->setRange(0,duration); //设置进度条最大值
music_duration = QString("%1:%2").arg(duration/1000/60).arg(duration/1000%60); //显示周期
ui->label_speed->setText(QString("00:00/%1").arg(music_duration));
ui->listWidget->setCurrentRow(playlist->currentIndex()); //显示歌曲切换
}
//进度改变
void Player::set_value(qint64 position)
{
ui->horizontalSlider_speed->setValue(position); //更新进度条的值
ui->label_speed->setText(QString("%1:%2/%3"). //显示进度
arg(position/1000/60).arg(position/1000%60).arg(music_duration));
}
//手动调整进度
void Player::on_horizontalSlider_speed_sliderMoved(int position)
{
mplayer->setPosition(position);
}
完整代码:https://download.csdn.net/download/weixin_43793181/13507068