目录
主要就qdarkstyle+QMediaPlaylist+QMediaPlayer
效果图:
主要就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();
}