自學QT之簡易音樂播放器基於QT5.5

本身寫的音樂播放器,還存在不少bug,只是做爲一種嘗試而已。交流學習羣:271251545編程

播放器實現的功能:添加歌曲、上一首、暫停、下一首、切換歌曲、托盤、任務欄對歌曲進行操做less


界面偷懶,直接使用的設計師界面,歌曲列表使用的是qtablewidget作的ide

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
相關文章
相關標籤/搜索