Qt开发——Music Player暗黑风格音乐播放器

目录

效果图:

主要就qdarkstyle+QMediaPlaylist+QMediaPlayer

mainwindow.cpp

mainwindow.h

main.cpp

修复了主要的bug后的:

 mainwindow.h

mainwindow.cpp

main.cpp


效果图:

主要就qdarkstyle+QMediaPlaylist+QMediaPlayer

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

// 若MSVC 编译版本错误,修改 msvc-version.conf 文件
// 解决MSVC编译时,界面汉字乱码的问题
#if _MSC_VER >= 1600     //MSVC2015>1899,    MSVC_VER= 14.0
#pragma execution_character_set("utf-8")
#endif

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowIcon(QIcon("music.png"));
    setWindowTitle(QStringLiteral("Music Player"));
    ui->PlayBtn->setIcon(QIcon("play.png"));
    ui->PreBtn->setIcon(QIcon("pre.png"));
    ui->NextBtn->setIcon(QIcon("next.png"));
    ui->OpenBtn->setIcon(QIcon("list.png"));
    ui->VolumBtn->setIcon(QIcon("volume.png"));
    //设置封面
    QPixmap Pix = QPixmap("Jane.jpg");
    QSize pixsize = ui->label->size();
    Pix.scaled(pixsize,Qt::KeepAspectRatioByExpanding);
    ui->label->setScaledContents(true);
    ui->label->setPixmap(Pix);

    player = new QMediaPlayer(this);
    playlist = new QMediaPlaylist(this);

    //默认开始播放默认歌曲
    playlist->addMedia(QUrl::fromLocalFile("music/love.mp3"));
    playlist->addMedia(QUrl::fromLocalFile("music/All of Me.mp3"));
//    playlist->addMedia(QUrl::fromLocalFile("music/Bang Bang.mp3"));
    playlist->addMedia(QUrl::fromLocalFile("music/G.mp3"));
//    playlist->addMedia(QUrl::fromLocalFile("music/love.mp3"));
//    playlist->addMedia(QUrl::fromLocalFile("music/Work For it.mp3"));
//    playlist->addMedia(QUrl::fromLocalFile("music/Dear Jane.mp3"));
//    playlist->addMedia(QUrl::fromLocalFile("music/Bazaar.mp3"));

    player->setMedia(playlist);
    //默认播放设置
    ui->listWidget->addItem("love-Alin.mp3");
    ui->listWidget->addItem("All of Me-Jane.mp3");
    ui->listWidget->addItem("G大调的悲伤-Jane.mp3");
    ui->Namelabel->setText(QStringLiteral("love-Alin.mp3"));
    player->setVolume(30);
    ui->VolumSplider->setValue(30);
    playlist->setPlaybackMode(QMediaPlaylist::Loop);//设置循环模式
    player->play();

    connect(player,SIGNAL(positionChanged(int)),
            this, SLOT(onPositionChanged(int)));
    connect(player,SIGNAL(durationChanged(qint64)),
            this, SLOT(onDurationChanged(qint64)));
    connect(playlist,SIGNAL(currentIndexChanged(int)),
            this, SLOT(onPlaylistChanged(int)));
}

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

//下一首
void MainWindow::on_NextBtn_clicked()
{
    playlist->next();
    qDebug()<<"currentindex:"<<playlist->currentIndex()<<endl;
}

//上一首
void MainWindow::on_PreBtn_clicked()
{
    playlist->previous();
    qDebug()<<"currentindex:"<<playlist->currentIndex()<<endl;
}

//播放
void MainWindow::on_PlayBtn_clicked()
{
    numPlay++;
    qDebug()<<numPlay<<endl;
    if(numPlay%2==0){
        player->play();
        ui->PlayBtn->setIcon(QIcon("pause.png"));
    }else{
        ui->PlayBtn->setIcon(QIcon("play.png"));
        player->stop();
    }
}

//打开文件
void MainWindow::on_OpenBtn_clicked()
{
    QString curPath = QDir::homePath();//获取用户目录
    QString dlgTitle = QStringLiteral("请选择音频文件");
    QString filter = QStringLiteral("音频文件(*.mp3 *wav *wma);;mp3文件(*mp3);;"
                                    "wav文件(*wav);;wma文件(*wma);;所有文件(*.*)");
    QStringList fileList = QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter);
    if(fileList.count()<1){
        qDebug()<<"open false"<<endl;
        return;
    }
    for(int i=0;i<fileList.count();i++){
        QString aFile = fileList.at(i);
        playlist->addMedia(QUrl::fromLocalFile(aFile));
        QFileInfo fileInfo(aFile);//???
        ui->listWidget->addItem(fileInfo.fileName());//添加到文件列表
    }
}

//音量键,按下后静音
void MainWindow::on_VolumBtn_clicked()
{
    bool mute=player->isMuted();
    player->setMuted(!mute);
    if (mute)
        ui->VolumBtn->setIcon(QIcon("volume.png"));
    else
        ui->VolumBtn->setIcon(QIcon("mute.png"));

}

//音量进度条
void MainWindow::on_VolumSplider_valueChanged(int value)
{
    player->setVolume(value);
}

//歌曲进度条调整
void MainWindow::on_ScheSlider_valueChanged(int value)
{
    player->setPosition(value);
}

//播放列表变化,更新当前播放文件名显示
void MainWindow::onPlaylistChanged(int position)
{
    if(playlist->currentIndex()%3==0){
        QPixmap Pix = QPixmap("Jane2.jpg");
        QSize pixsize = ui->label->size();
        Pix.scaled(pixsize,Qt::KeepAspectRatioByExpanding);
        ui->label->setScaledContents(true);
        ui->label->setPixmap(Pix);
    }else if(playlist->currentIndex()%3==1){
        QPixmap Pix = QPixmap("Jane.jpg");
        QSize pixsize = ui->label->size();
        Pix.scaled(pixsize,Qt::KeepAspectRatioByExpanding);
        ui->label->setScaledContents(true);
        ui->label->setPixmap(Pix);
    }else if(playlist->currentIndex()%3==2){
        QPixmap Pix = QPixmap("Alin.jpg");
        QSize pixsize = ui->label->size();
        Pix.scaled(pixsize,Qt::KeepAspectRatioByExpanding);
        ui->label->setScaledContents(true);
        ui->label->setPixmap(Pix);
    }
    ui->listWidget->setCurrentRow(position);
    QListWidgetItem  *item=ui->listWidget->currentItem();
    if (item){
        ui->Namelabel->setText(item->text());
    }
}

//文件时长变化,更新进度显示
void MainWindow::onDurationChanged(int duration)
{
     ui->ScheSlider->setMaximum(duration);

     int   secs=duration/1000;//秒
     int   mins=secs/60; //分钟
     secs=secs % 60;//余数秒
     durationTime=QString::asprintf("%d:%d",mins,secs);
     ui->PositionLabel->setText(positionTime+"/"+durationTime);
}

//双击切换歌曲
void MainWindow::on_listWidget_doubleClicked(const QModelIndex &index)
{
    int rowNo=index.row();
    qDebug()<<"currentindex:"<<playlist->currentIndex()<<endl;
    playlist->setCurrentIndex(rowNo);
    player->play();
}

//当前文件播放位置变化,更新进度显示
void MainWindow::onPositionChanged(int position)
{
    if (ui->ScheSlider->isSliderDown())
        return;

    ui->ScheSlider->setSliderPosition(position);

    int   secs=position/1000;//秒
    int   mins=secs/60; //分钟
    secs=secs % 60;//余数秒
    positionTime=QString::asprintf("%d:%d",mins,secs);
    ui->PositionLabel->setText(positionTime+"/"+durationTime);
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QDebug>
#include <QPixmap>
#include <QFile>
#include <QFileInfo>
#include <QDir>
#include <QFileDialog>
#include <QStringList>
#include <QStackedWidget>
#include <QPixmap>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    //自定义槽函数
    void onPlaylistChanged(int position);
    void onPositionChanged(int position);
    void onDurationChanged(int duration);

    void on_NextBtn_clicked();

    void on_PreBtn_clicked();

    void on_PlayBtn_clicked();

    void on_OpenBtn_clicked();

    void on_VolumBtn_clicked();

    void on_VolumSplider_valueChanged(int value);

    void on_ScheSlider_valueChanged(int value);

    void on_listWidget_doubleClicked(const QModelIndex &index);


private:
    QMediaPlayer *player;
    QMediaPlaylist *playlist;
    int numPlay=0;
    QString  durationTime;//总长度
    QString  positionTime;//当前播放到位置

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

main.cpp

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFile f(":qdarkstyle/style.qss");

    if(!f.exists()){
        printf("Unable to set stylesheet, file not found\n");
    }else{
        f.open(QFile::ReadOnly | QFile::Text);
        QTextStream ts(&f);
        qApp->setStyleSheet(ts.readAll());
    }
    MainWindow w;
    w.show();

    return a.exec();
}

还有些不痛不痒的bug,后面调完放github上了


修复了主要的bug后的:

 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QDebug>
#include <QPixmap>
#include <QFile>
#include <QFileInfo>
#include <QDir>
#include <QFileDialog>
#include <QStringList>
#include <QStackedWidget>
#include <QPixmap>
#include <QtWinExtras>
#include <QCommandLineParser>
#include <QCommandLineOption>
#include <QDesktopWidget>
#include <QFileInfo>
#include <QMimeDatabase>
#include <QSettings>
#include <QIcon>
#include <QDir>
#include <QUrl>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    //自定义槽函数
    void onPlaylistChanged(int position);
    void onPositionChanged(qint64 position);
    void onDurationChanged(qint64 duration);

    void on_NextBtn_clicked();

    void on_PreBtn_clicked();

    void on_PlayBtn_clicked();

    void on_OpenBtn_clicked();

    void on_VolumBtn_clicked();

    void on_VolumSplider_valueChanged(int value);

    void on_ScheSlider_valueChanged(int value);

    void on_listWidget_doubleClicked(const QModelIndex &index);


    void on_VolumBox_valueChanged(int arg1);

private:
    QMediaPlayer *player;
    QMediaPlaylist *playlist;
    QString  durationTime;//总长度
    QString  positionTime;//当前播放到位置

    QWinTaskbarButton *taskbarButton = nullptr;
    QWinTaskbarProgress *taskbarProgress = nullptr;
    QWinThumbnailToolBar *thumbnailToolBar = nullptr;
    QWinThumbnailToolButton *playToolButton = nullptr;
    QWinThumbnailToolButton *forwardToolButton = nullptr;
    QWinThumbnailToolButton *backwardToolButton = nullptr;

    void createTaskbar();//创建小视图的进度条
    void createThumbnailToolBar();//创建小视图按钮
    void createJumpList();//创建小窗口list

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtWidgets>
#include <QtWinExtras>

// 若MSVC 编译版本错误,修改 msvc-version.conf 文件
// 解决MSVC编译时,界面汉字乱码的问题
#if _MSC_VER >= 1600     //MSVC2015>1899,    MSVC_VER= 14.0
#pragma execution_character_set("utf-8")
#endif

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowIcon(QIcon("music.png"));
    setWindowTitle(QStringLiteral("Music Player"));
    ui->PlayBtn->setIcon(QIcon("play.png"));
    ui->PreBtn->setIcon(QIcon("pre.png"));
    ui->NextBtn->setIcon(QIcon("next.png"));
    ui->OpenBtn->setIcon(QIcon("list.png"));
    ui->VolumBtn->setIcon(QIcon("volume.png"));
    //设置封面
    QPixmap Pix = QPixmap("Jane.jpg");
    QSize pixsize = ui->label->size();
    Pix.scaled(pixsize,Qt::KeepAspectRatioByExpanding);
    ui->label->setScaledContents(true);
    ui->label->setPixmap(Pix);

    player = new QMediaPlayer(this);
    playlist = new QMediaPlaylist(this);

    //默认开始播放默认歌曲
    playlist->addMedia(QUrl::fromLocalFile("music/love.mp3"));
    playlist->addMedia(QUrl::fromLocalFile("music/All of Me.mp3"));
    playlist->addMedia(QUrl::fromLocalFile("music/G.mp3"));

    player->setMedia(playlist);
    //默认播放设置
    ui->listWidget->addItem("love-Alin.mp3");
    ui->listWidget->addItem("All of Me-Jane.mp3");
    ui->listWidget->addItem("G大调的悲伤-Jane.mp3");
    setWindowTitle(QStringLiteral("Music Player-Love-Alin.mp3"));
    player->setVolume(30);
    ui->VolumSplider->setValue(30);
    ui->VolumBox->setValue(30);
    playlist->setPlaybackMode(QMediaPlaylist::Loop);//设置循环模式
    player->play();

    connect(player,SIGNAL(positionChanged(qint64)),
            this, SLOT(onPositionChanged(qint64)));
    connect(player,SIGNAL(durationChanged(qint64)),
            this, SLOT(onDurationChanged(qint64)));
    connect(playlist,SIGNAL(currentIndexChanged(int)),
            this, SLOT(onPlaylistChanged(int)));
}

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

//下一首
void MainWindow::on_NextBtn_clicked()
{
    playlist->next();
    qDebug()<<"currentindex:"<<playlist->currentIndex()<<endl;
}

//上一首
void MainWindow::on_PreBtn_clicked()
{
    playlist->previous();
    qDebug()<<"currentindex:"<<playlist->currentIndex()<<endl;
}

//播放
void MainWindow::on_PlayBtn_clicked()
{
    if(player->state()==QMediaPlayer::StoppedState||player->state()==QMediaPlayer::PausedState){
        player->play();
        ui->PlayBtn->setIcon(QIcon("pause.png"));
    }else if(player->state()==QMediaPlayer::PlayingState){
        ui->PlayBtn->setIcon(QIcon("play.png"));
        player->stop();
    }

}

//打开文件
void MainWindow::on_OpenBtn_clicked()
{
    QString curPath = QDir::homePath();//获取用户目录
    QString dlgTitle = QStringLiteral("请选择音频文件");
    QString filter = QStringLiteral("音频文件(*.mp3 *wav *wma);;mp3文件(*mp3);;"
                                    "wav文件(*wav);;wma文件(*wma);;所有文件(*.*)");
    QStringList fileList = QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter);
    if(fileList.count()<1){
        qDebug()<<"open false"<<endl;
        return;
    }
    for(int i=0;i<fileList.count();i++){
        QString aFile = fileList.at(i);
        playlist->addMedia(QUrl::fromLocalFile(aFile));
        QFileInfo fileInfo(aFile);//???
        ui->listWidget->addItem(fileInfo.fileName());//添加到文件列表
    }
}

//音量键,按下后静音
void MainWindow::on_VolumBtn_clicked()
{
    bool mute=player->isMuted();
    player->setMuted(!mute);
    if (mute)
        ui->VolumBtn->setIcon(QIcon("volume.png"));
    else
        ui->VolumBtn->setIcon(QIcon("mute.png"));

}

//音量进度条改变
void MainWindow::on_VolumSplider_valueChanged(int value)
{
    player->setVolume(value);
    ui->VolumBox->setValue(value);
}

//歌曲进度条调整
void MainWindow::on_ScheSlider_valueChanged(int value)
{
    player->setPosition(value);
}

//播放列表变化,更新当前播放文件名显示
void MainWindow::onPlaylistChanged(int position)
{
    if(playlist->currentIndex()%3==0){
        QPixmap Pix = QPixmap("Jane2.jpg");
        QSize pixsize = ui->label->size();
        Pix.scaled(pixsize,Qt::KeepAspectRatioByExpanding);
        ui->label->setScaledContents(true);
        ui->label->setPixmap(Pix);
    }else if(playlist->currentIndex()%3==1){
        QPixmap Pix = QPixmap("Jane.jpg");
        QSize pixsize = ui->label->size();
        Pix.scaled(pixsize,Qt::KeepAspectRatioByExpanding);
        ui->label->setScaledContents(true);
        ui->label->setPixmap(Pix);
    }else if(playlist->currentIndex()%3==2){
        QPixmap Pix = QPixmap("Alin.jpg");
        QSize pixsize = ui->label->size();
        Pix.scaled(pixsize,Qt::KeepAspectRatioByExpanding);
        ui->label->setScaledContents(true);
        ui->label->setPixmap(Pix);
    }
    ui->listWidget->setCurrentRow(position);
    QListWidgetItem  *item=ui->listWidget->currentItem();
    if (item){
        setWindowTitle(QStringLiteral("Music Player-")+item->text());
    }
}

//文件时长变化,更新进度显示
void MainWindow::onDurationChanged(qint64 duration)
{
     ui->ScheSlider->setMaximum(duration);
     int   secs=duration/1000;//秒
     int   mins=secs/60; //分钟
     secs=secs % 60;//余数秒
     durationTime=QString::asprintf("%d:%d",mins,secs);
     ui->PositionLabel->setText(positionTime+"/"+durationTime);
}

//双击切换歌曲
void MainWindow::on_listWidget_doubleClicked(const QModelIndex &index)
{
    int rowNo=index.row();
    qDebug()<<"currentindex:"<<playlist->currentIndex()<<endl;
    playlist->setCurrentIndex(rowNo);
    player->play();
}

//当前文件播放位置变化,更新进度显示
void MainWindow::onPositionChanged(qint64 position)
{
    if (ui->ScheSlider->isSliderDown())
        return;

    ui->ScheSlider->setSliderPosition(position);

    int   secs=position/1000;//秒
    int   mins=secs/60; //分钟
    secs=secs % 60;//余数秒
    positionTime=QString::asprintf("%d:%d",mins,secs);
    ui->PositionLabel->setText(positionTime+"/"+durationTime);
}

//音量SpiBox改变
void MainWindow::on_VolumBox_valueChanged(int arg1)
{
    ui->VolumSplider->setValue(arg1);
    player->setVolume(arg1);
}

//创建小窗口list
void MainWindow::createJumpList(){
    QWinJumpList jumplist;
    jumplist.recent()->setVisible(true);
}

//创建小视图的进度条
void MainWindow::createTaskbar(){
    taskbarButton = new QWinTaskbarButton(this);
    taskbarButton->setWindow(windowHandle());  // 使用窗口句柄作为参数

    taskbarProgress = taskbarButton->progress();
    connect(ui->ScheSlider, SIGNAL(valueChanged(int)), taskbarProgress, SLOT(setValue(int)));
    connect(ui->ScheSlider, SIGNAL(rangeChanged(int,int)), taskbarProgress, SLOT(setRange(int,int)));

    connect(player, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(updateTaskbar()));
}

//创建小视图窗口按钮
void MainWindow::createThumbnailToolBar(){
    thumbnailToolBar = new QWinThumbnailToolBar(this);
    thumbnailToolBar->setWindow(windowHandle());

    playToolButton = new QWinThumbnailToolButton(thumbnailToolBar);
    playToolButton->setEnabled(false);
    playToolButton->setToolTip(tr("Play"));
    playToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
    connect(playToolButton, SIGNAL(clicked()), this, SLOT(togglePlayback()));

    forwardToolButton = new QWinThumbnailToolButton(thumbnailToolBar);
    forwardToolButton->setEnabled(false);
    forwardToolButton->setToolTip(tr("Fast forward"));
    forwardToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaSeekForward));
    connect(forwardToolButton, SIGNAL(clicked()), this, SLOT(seekForward()));

    backwardToolButton = new QWinThumbnailToolButton(thumbnailToolBar);
    backwardToolButton->setEnabled(false);
    backwardToolButton->setToolTip(tr("Rewind"));
    backwardToolButton->setIcon(style()->standardIcon(QStyle::SP_MediaSeekBackward));
    connect(backwardToolButton, SIGNAL(clicked()), this, SLOT(seekBackward()));

    thumbnailToolBar->addButton(backwardToolButton);
    thumbnailToolBar->addButton(playToolButton);
    thumbnailToolBar->addButton(forwardToolButton);

    connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(updateThumbnailToolBar()));
    connect(player, SIGNAL(durationChanged(qint64)), this, SLOT(updateThumbnailToolBar()));
    connect(player, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(updateThumbnailToolBar()));
}

main.cpp

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

static void associateFileTypes(const QStringList &fileTypes) // 这是一个helper函数,用来将某文件格式与本程序关联
{
    QString displayName = QGuiApplication::applicationDisplayName();
    QString filePath = QCoreApplication::applicationFilePath();
    QString fileName = QFileInfo(filePath).fileName();

    QSettings settings("HKEY_CURRENT_USER\\Software\\Classes\\Applications\\" + fileName, QSettings::NativeFormat);
    settings.setValue("FriendlyAppName", displayName);

    settings.beginGroup("SupportedTypes");
    foreach (const QString& fileType, fileTypes)
        settings.setValue(fileType, QString());
    settings.endGroup();

    settings.beginGroup("shell");
    settings.beginGroup("open");
    settings.setValue("FriendlyAppName", displayName);
    settings.beginGroup("Command");
    settings.setValue(".", QChar('"') + QDir::toNativeSeparators(filePath) + QString("\" \"%1\""));
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setOrganizationName("QtWinExtras");
    a.setOrganizationDomain("qt-project.org");
    a.setApplicationDisplayName("QtWinExtras Music Player");

    associateFileTypes(QStringList(".mp3"));                // helper函数的使用方式

    QFile f(":qdarkstyle/style.qss");
    if(!f.exists()){
        printf("Unable to set stylesheet, file not found\n");
    }else{
        f.open(QFile::ReadOnly | QFile::Text);
        QTextStream ts(&f);
        qApp->setStyleSheet(ts.readAll());
    }

    MainWindow w;
    w.show();

    return a.exec();
}
发布了303 篇原创文章 · 获赞 308 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/104481005