自学QT之简易音乐播放器基于QT5.5

自己写的音乐播放器,还存在很多bug,只是作为一种尝试而已。交流学习群:271251545

播放器实现的功能:添加歌曲、上一首、暂停、下一首、切换歌曲、托盘、任务栏对歌曲进行操作


界面偷懒,直接使用的设计师界面,歌曲列表使用的是qtablewidget做的

player头文件代码:

#ifndef PLAYER_H
#define PLAYER_H

#include <QWidget>
#include <QMouseEvent>
#include <QPoint>
#include <QMediaPlayer>
#include <QFileDialog>
#include <QSystemTrayIcon>
#include <QEvent>
#include <QMenu>
#include <QAction>
#include "about.h"
#include <QWinThumbnailToolButton>
#include <QWinThumbnailToolBar>
#include <QStandardItemModel>
#include <QTableView>
#include <QDirModel>
#include <QDir>
#include <QStringListIterator>
#include <QMediaPlaylist>
#include <QTimer>



namespace Ui {
class player;
}

class player : public QWidget
{
    Q_OBJECT

public:
    explicit player(QWidget *parent = 0);
    ~player();
    QPoint drag;//定义一个释放点
    void mousePressEvent(QMouseEvent *);//窗口移动事件
    void mouseMoveEvent(QMouseEvent *);//窗口移动事件
    QMediaPlayer *myPlayer;
    QSystemTrayIcon *trayIcon;
protected:
    QAction *quitAction;
    QAction *aboutAction;
    QAction *nextAction;
    QAction *pauseAction;
    QAction *backAction;
    QWinThumbnailToolButton *backToolBtn;
    QWinThumbnailToolButton *pauseToolBtn;
    QWinThumbnailToolButton *nextToolBtn;
    QWinThumbnailToolBar *taskBar;
    QStandardItemModel *songListModel;
    QStringList path;
    QMediaPlaylist *playList;
    QTimer *timer;
    qint64 pausePosition;
    int currentIndex;


private slots:
    void on_closeBtn_clicked();
    void on_miniBtn_clicked();
    void on_pushButton_2_clicked();
    void on_pauseBtn_clicked();
    void on_volum_valueChanged(int value);
    void tuopan(QSystemTrayIcon::ActivationReason reason);
    void showAbout();
    void myPlayerSlot(QModelIndex index);
    void on_importBtn_clicked();
    void setPosition();
    void on_horizontalSlider_valueChanged(int value);
    void on_nextBtn_clicked();
    void on_backBtn_clicked();
    void mediaChange(int);

private:
    Ui::player *ui;
};

#endif // PLAYER_H

player.cpp文件代码:

#include "player.h"
#include "ui_player.h"
#include <QDebug>
#include <QtWinExtras>
#include <QList>

player::player(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::player)
{
    ui->setupUi(this);
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint);//隐藏标题栏
    setWindowIcon(QIcon(":/new/prefix1/image/tray.jpg"));
    myPlayer=new QMediaPlayer();
    ui->volum->setValue(50);
    myPlayer->setVolume(ui->volum->value());
    playList=new QMediaPlaylist;
    trayIcon=new QSystemTrayIcon;
    connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,
            SLOT(tuopan(QSystemTrayIcon::ActivationReason)));//将托盘图标和双击事件关联

    QPixmap pixmap(":/new/prefix1/image/background.jpg");//当前文件夹下面的图片
    QPalette palette = this->palette();
    palette.setBrush(backgroundRole(), QBrush(pixmap));
    connect(playList,SIGNAL(currentIndexChanged(int)),this,SLOT(mediaChange(int)));
    setPalette(palette);

    //任务栏按钮
    QMenu * menu=new QMenu(this);
    if (QtWin::isCompositionEnabled()) {
        QtWin::enableBlurBehindWindow(menu);
    } else{
        QtWin::disableBlurBehindWindow(menu);
        menu->hide();
    }
    taskBar=new QWinThumbnailToolBar();
    taskBar->setWindow(windowHandle());
    backToolBtn=new QWinThumbnailToolButton(taskBar);
    backToolBtn->setToolTip("上一首");
    backToolBtn->setIcon(QIcon(":/new/prefix1/image/back.png"));
    connect(backToolBtn,SIGNAL(clicked()),this,SLOT(on_backBtn_clicked()));
    pauseToolBtn=new QWinThumbnailToolButton(taskBar);
    connect(pauseToolBtn,SIGNAL(clicked()),this,SLOT(on_pauseBtn_clicked()));
    pauseToolBtn->setToolTip("暂停");
    pauseToolBtn->setIcon(QIcon(":/new/prefix1/image/pause.png"));
    nextToolBtn=new QWinThumbnailToolButton(taskBar);
    nextToolBtn->setToolTip("下一首");
    nextToolBtn->setIcon(QIcon(":/new/prefix1/image/next.png"));
    connect(nextToolBtn,SIGNAL(clicked()),this,SLOT(on_nextBtn_clicked()));
    taskBar->addButton(backToolBtn);
    taskBar->addButton(pauseToolBtn);
    taskBar->addButton(nextToolBtn);
    //歌曲列表
    songListModel=new QStandardItemModel;
    songListModel->setHorizontalHeaderItem(0,new QStandardItem(QObject::tr("歌曲列表")));   
    ui->songList->setModel(songListModel);
    ui->songList->setColumnWidth(0,390);    
    ui->songList->verticalHeader()->hide();
    ui->songList->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->songList->setSelectionBehavior(QAbstractItemView::SelectRows);
    connect(ui->songList,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(myPlayerSlot(QModelIndex)));
    //定时器
    timer=new QTimer;
    connect(timer,SIGNAL(timeout()),this,SLOT(setPosition()));
}

player::~player()
{
    delete ui;
}

void player::on_closeBtn_clicked()//单击关闭按钮,产生托盘和托盘菜单
{
    this->hide();
    ui->nameLabel->styleSheet();
    trayIcon->setIcon(QIcon(":/new/prefix1/image/tray.jpg"));
    QMenu *trayMenu=new QMenu();
    aboutAction=new QAction(tr("关于"),this);
    quitAction=new QAction(tr("退出"),this);
    trayMenu->addAction(aboutAction);
    connect(aboutAction,SIGNAL(triggered(bool)),this,SLOT(showAbout()));
    trayMenu->addAction(quitAction);
    connect(quitAction,SIGNAL(triggered(bool)),this,SLOT(close()));
    trayIcon->setContextMenu(trayMenu);
    trayIcon->setToolTip("托盘图标");
    trayIcon->show();
    trayIcon->showMessage("主人","我在这里哦",QSystemTrayIcon::Information,5000);//一定要放在这里,否则提示信息会不显示
}

void player::on_miniBtn_clicked()
{
    this->showMinimized();
}
void player::mousePressEvent(QMouseEvent *e)
{
    if(e->button()==Qt::LeftButton)//button()是按钮
    {
        drag=e->globalPos()-this->geometry().topLeft();//鼠标位置减去左上角的左边
        e->accept();
    }
}
void player::mouseMoveEvent(QMouseEvent *e)
{
    if(e->buttons()&Qt::LeftButton)//buttons()返回的是按钮状态
    {
        move(e->globalPos()-drag);
        e->accept();
    }
}
//选择歌曲
void player::on_pushButton_2_clicked()
{
    QString path=QFileDialog::getOpenFileName(this,tr("选择一首歌曲"),"/","*.mp3");
    QFileInfo fileInfo;
    fileInfo=QFileInfo(path);
    QString fileName=fileInfo.baseName();
    ui->nameLabel->setText(fileName);
    myPlayer->setMedia(QUrl::fromLocalFile(path));
    myPlayer->play();

}

//暂停按钮
void player::on_pauseBtn_clicked()
{
    switch (myPlayer->state()) {
    case QMediaPlayer::PlayingState:
        timer->stop();
        currentIndex=playList->currentIndex();
        pausePosition=myPlayer->position();
        myPlayer->pause();
        break;
    case QMediaPlayer::PausedState:
        myPlayer->setMedia(playList->media(currentIndex));
        myPlayer->setPosition(pausePosition);
        timer->start(1000);
        myPlayer->play();
        break;
    default:
        break;
    }

}
//音量调节
void player::on_volum_valueChanged(int value)
{
    myPlayer->setVolume(value);
}
void player::tuopan(QSystemTrayIcon::ActivationReason reason)//双击托盘图标,恢复程序正常界面
{
    switch (reason)
    {
    case QSystemTrayIcon::DoubleClick:
        this->showNormal();
        break;
    default:
        break;
    }
}
//显示关于本程序对话框
void player::showAbout()
{
    about showabout;
    showabout.setModal(false);
    showabout.setWindowTitle("关于本程序");
    showabout.exec();
}

//导入多首歌曲
void player::on_importBtn_clicked()
{
    path=QFileDialog::getOpenFileNames(this,"选择歌曲","/","(*.mp3)");
    int i=0;
    QString addSongs;
    QListIterator<QString> mylist(path);
    while(mylist.hasNext())
    {
        addSongs=mylist.next();
        QFileInfo fileInfo;
        fileInfo=QFileInfo(addSongs);
        QString fileName=fileInfo.fileName();
        songListModel->setItem(i,0,new QStandardItem(fileName));
        playList->addMedia(QUrl::fromLocalFile(addSongs));
        i++;
    }

    playList->setPlaybackMode(QMediaPlaylist::Loop);
    myPlayer->setPlaylist(playList);

}
//双击播放
void player::myPlayerSlot(QModelIndex index)
{

    timer->start(1000);
    int n=index.row();
    playList->setCurrentIndex(n);

//    myPlayer->setMedia(playList->currentMedia());这句话不能加,加了反而错误
    myPlayer->play();
}
//设置播放进度条
void player::setPosition()
{
    qint64 position=myPlayer->position();
    ui->horizontalSlider->setMaximum(myPlayer->duration());
    ui->horizontalSlider->setSliderPosition(position);
}
void player::on_horizontalSlider_valueChanged(int value)//快进和快退功能
{
    qint64 currentPosition=myPlayer->position();
    if(qAbs(value-currentPosition)>2000&&(ui->horizontalSlider->value()!=0))
    {
        myPlayer->stop();
        timer->stop();
        myPlayer->setPosition(value);
        timer->start();
        myPlayer->play();
    }
}

void player::on_nextBtn_clicked()//播放下一首
{
    if(playList->mediaCount()-playList->currentIndex()!=1)//这里注意的是,和我们正常数数一样,mediaCount是从1开始计数的
    {
        //myPlayer->setMedia(playList->media(playList->nextIndex()));
        playList->setCurrentIndex(playList->nextIndex());
        myPlayer->play();
    }
    else
    {
        playList->setCurrentIndex(0);
       // myPlayer->setMedia(playList->media(0));
        myPlayer->play();
    }
}

void player::on_backBtn_clicked()//播放上一首
{
    if(playList->currentIndex()!=0)//这里注意的是,和我们正常数数一样,mediaCount是从1开始计数的
    {
        //myPlayer->setMedia(playList->media(playList->previousIndex()));
        playList->setCurrentIndex(playList->previousIndex());
        myPlayer->play();
    }
    else
    {
        playList->setCurrentIndex(playList->mediaCount()-1);
        //myPlayer->setMedia(playList->media(playList->mediaCount()-1));
        myPlayer->play();
    }

}
void player::mediaChange(int i)
{
    ui->nameLabel->setText(path.at(i));
}


关于对话框头文件:

#ifndef ABOUT_H
#define ABOUT_H

#include <QWidget>
#include <QDialog>

class about : public QDialog
{
    Q_OBJECT
public:
    explicit about(QWidget *parent = 0);

signals:

public slots:
};

#endif // ABOUT_H

关于对话框源码:

#include "about.h"
#include <QLabel>
#include <QGridLayout>

about::about(QWidget *parent) : QDialog(parent)
{
    QLabel *aboutLabel=new QLabel;
    aboutLabel->setText("小黑版本QT音乐播放器");
    QHBoxLayout *mainLayout=new QHBoxLayout(this);
    mainLayout->addWidget(aboutLabel,Qt::AlignCenter);


}

主函数:

#include "player.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    player w;
    w.show();

    return a.exec();
}

因为分享而快乐!QT&C++编程爱好者:271251545

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页