Linux下QT实现音乐播放器的基本功能,包含进度、音量调节

在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

猜你喜欢

转载自blog.csdn.net/weixin_43793181/article/details/110824494