
音乐播放器详细可参考正点原子QT教程视频播放器的设计图片资料也是从正点原子的资料中下载。本人没有做太大改动。爱心按钮修改为可对不同歌曲进行点亮并保存同时进入界面后需要点击列表才会显示音乐清单也可以隐藏。歌词显示功能未添加有兴趣可以自己捣鼓一、ui界面部分二、代码实现部分功能1musicplayer.h文件#ifndef MUSICPLAYER_H #define MUSICPLAYER_H #include QMainWindow #include QWidget #include QMediaPlayer #include QMediaPlaylist #include QListWidget #include QDebug QT_BEGIN_NAMESPACE namespace Ui { class MusicPlayer; } QT_END_NAMESPACE /* 媒体信息结构体 */ struct music_MediaObjectInfo { /* 用于保存歌曲文件名 */ QString fileName; /* 用于保存歌曲文件路径 */ QString filePath; }; class MusicPlayer : public QWidget { Q_OBJECT public: MusicPlayer(QWidget *parent nullptr); ~MusicPlayer(); // 媒体播放器用于播放音乐 QMediaPlayer *musicPlayer; private: Ui::MusicPlayer *ui; // 媒体列表 QMediaPlaylist *mediaPlaylist; // 用于遮罩 QWidget *listMask; //喜欢按钮独立保存 QVectorbool v; // 当前音乐文件序列 int CurrentIndex; // 主窗体大小重设大小函数重写 void resizeEvent(QResizeEvent *event); // 媒体信息存储 QVectormusic_MediaObjectInfo mediaObjectInfo; // 媒体播放器类初始化 void mediaPlayerInit(); private slots: // 媒体状态改变 void mediaPlayerStateChanged(QMediaPlayer::State); // 媒体列表项改变 void mediaPlaylistCurrentIndexChanged(int); // 媒体总长度改变 void musicPlayerDurationChanged(qint64); // 媒体播放位置改变 void mediaPlayerPositionChanged(qint64); void on_durationSlider_sliderReleased(); void on_listWidget_itemClicked(QListWidgetItem *item); void on_btn_volume_clicked(bool checked); void on_volumeslider_sliderReleased(); void on_btn_mode_clicked(bool checked); void on_btn_menu_clicked(bool checked); void on_btn_favorite_clicked(bool checked); void on_btn_exit_clicked(); public slots: void on_btn_previous_clicked(); void on_btn_play_clicked(); void on_btn_next_clicked(); signals: void music_show_main(); }; #endif // MUSICPLAYER_H2musicplayer.cpp文件#include musicplayer.h #include ui_musicplayer.h #include QCoreApplication #include QFileInfoList #include QDir MusicPlayer::MusicPlayer(QWidget *parent) : QWidget(parent) , ui(new Ui::MusicPlayer) { ui-setupUi(this); // pal调色板 QPalette pal; pal.setColor(QPalette::WindowText, Qt::white); ui-label-setPalette(pal); ui-label_2-setPalette(pal); ui-label_3-setPalette(pal); // 设置label_1的格式 ui-label_1-setMinimumSize(320, 320); QImage Image; Image.load(:/images/cd.png); QPixmap pixmap QPixmap::fromImage(Image); int with 320; int height 320; QPixmap fitpixmap pixmap.scaled(with, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); ui-label_1-setPixmap(fitpixmap); ui-label_1-setAlignment(Qt::AlignCenter); // 音乐列表 ui-listWidget-setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff); ui-listWidget-setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff); /* 列表遮罩 */ listMask new QWidget(ui-listWidget); listMask-setMinimumSize(310, 40); listMask-setMinimumHeight(40); listMask-setObjectName(listMask); listMask-setGeometry(0,ui-listWidget-height() - 40,310,40); // listMask-setStyleSheet(background-color:green); // 音量条设置 ui-volumeslider-setFocusPolicy(Qt::NoFocus); //去除虚线边框 ui-volumeslider-setVisible(false); //开机先隐藏 ui-volumeslider-installEventFilter(this); //安装事件过滤器 ui-volumeslider-setValue(100); //设置媒体默认音量 ui-volumeslider-raise();//设置到最前面 // 媒体播放器初始化 mediaPlayerInit(); // 媒体信号槽连接 connect(musicPlayer,SIGNAL(stateChanged(QMediaPlayer::State)), this,SLOT(mediaPlayerStateChanged(QMediaPlayer::State))); connect(mediaPlaylist,SIGNAL(currentIndexChanged(int)),this, SLOT(mediaPlaylistCurrentIndexChanged(int))); connect(musicPlayer,SIGNAL(durationChanged(qint64)),this, SLOT(musicPlayerDurationChanged(qint64))); connect(musicPlayer,SIGNAL(positionChanged(qint64)),this, SLOT(mediaPlayerPositionChanged(qint64))); // 设置焦点 this-setFocus(); } MusicPlayer::~MusicPlayer() { delete ui; } // 上一首按钮 void MusicPlayer::on_btn_previous_clicked() { musicPlayer-stop(); int count mediaPlaylist-mediaCount(); if (0 count) return; /* 列表上一个 */ mediaPlaylist-previous(); musicPlayer-play(); } // 播放按钮 void MusicPlayer::on_btn_play_clicked() { int state musicPlayer-state(); switch (state) { case QMediaPlayer::StoppedState: //媒体播放 musicPlayer-play(); break; case QMediaPlayer::PlayingState: // 媒体暂停 musicPlayer-pause(); break; case QMediaPlayer::PausedState: musicPlayer-play(); break; } } // 下一首按钮 void MusicPlayer::on_btn_next_clicked() { musicPlayer-stop(); int count mediaPlaylist-mediaCount(); if(count 0) return; // 列表下一个 mediaPlaylist-next(); musicPlayer-play(); } // 拖拽播放进度条 void MusicPlayer::on_durationSlider_sliderReleased() { // 设置媒体播放位置 musicPlayer-setPosition(ui-durationSlider-value()*1000); } // 列表点击换歌曲 void MusicPlayer::on_listWidget_itemClicked(QListWidgetItem *item) { musicPlayer-stop(); mediaPlaylist-setCurrentIndex(ui-listWidget-row(item)); musicPlayer-play(); } // 媒体状态改变 void MusicPlayer::mediaPlayerStateChanged(QMediaPlayer::State state) { ui-btn_favorite-setChecked(v[CurrentIndex]); switch (state) { case QMediaPlayer::StoppedState: ui-btn_play-setChecked(false);//播放按钮设置为暂停 break; case QMediaPlayer::PlayingState: ui-btn_play-setChecked(true);//播放按钮设置为播放 break; case QMediaPlayer::PausedState: ui-btn_play-setChecked(false); break; } } // 媒体列表项改变 void MusicPlayer::mediaPlaylistCurrentIndexChanged(int index) { if(index -1) return; //设置列表正在播放的项 CurrentIndexindex; ui-listWidget-setCurrentRow(index); } // 换媒体歌曲时总长度时间改变 void MusicPlayer::musicPlayerDurationChanged(qint64 duration) { ui-durationSlider-setRange(0, duration / 1000); int second duration / 1000; int minute second / 60; second % 60; QString mediaDuration; mediaDuration.clear(); if (minute 10) mediaDuration QString::number(minute, 10); else mediaDuration 0 QString::number(minute, 10); if (second 10) mediaDuration mediaDuration : QString::number(second, 10); else mediaDuration mediaDuration :0 QString::number(second, 10); /* 显示媒体总长度时间 */ ui-label_3-setText(mediaDuration); } // 当前歌曲播放进度时间改变 void MusicPlayer::mediaPlayerPositionChanged( qint64 position) { if (!ui-durationSlider-isSliderDown()) ui-durationSlider-setValue(position/1000); int second position / 1000; int minute second / 60; second % 60; QString mediaPosition; mediaPosition.clear(); if (minute 10) mediaPosition QString::number(minute, 10); else mediaPosition 0 QString::number(minute, 10); if (second 10) mediaPosition mediaPosition : QString::number(second, 10); else mediaPosition mediaPosition :0 QString::number(second, 10); /* 显示现在播放的时间 */ ui-label_2-setText(mediaPosition); } // Qt窗口大小、位置及其大小改变引起的事件QResizeEvent // 使得Qt界面的控件随窗口的变化而变化 void MusicPlayer::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); listMask-setGeometry(0, ui-listWidget-height() - 40, 310, 40); } // 媒体播放器类初始化 void MusicPlayer::mediaPlayerInit() { musicPlayer new QMediaPlayer(this); mediaPlaylist new QMediaPlaylist(this); // 确保列表是空的 mediaPlaylist-clear(); // 设置音乐播放器的列表为mediaPlaylist musicPlayer-setPlaylist(mediaPlaylist); // 设置循环播放模式LOOP是按顺序列循环 mediaPlaylist-setPlaybackMode(QMediaPlaylist::Loop); } void MusicPlayer::on_btn_volume_clicked(bool checked) { if(checked) { ui-volumeslider-setVisible(true); } else { ui-volumeslider-setVisible(false); } } // 拖拽音量进度条 void MusicPlayer::on_volumeslider_sliderReleased() { // 设置音量大小 musicPlayer-setVolume(ui-volumeslider-value()); } // 播放模式功能循环播放和顺序播放 void MusicPlayer::on_btn_mode_clicked(bool checked) { if(checked) { mediaPlaylist-setPlaybackMode(QMediaPlaylist::CurrentItemInLoop); } else { mediaPlaylist-setPlaybackMode(QMediaPlaylist::Loop); } } // 歌曲列表 void MusicPlayer::on_btn_menu_clicked(bool checked) { QDir dir(QCoreApplication::applicationDirPath() /myMusic); // qDebug() 文件路径为 dir endl; QDir dirbsolutePath(dir.absolutePath()); /* 定义过滤器 */ QStringList filter; /* 包含所有.mp3后缀的文件 */ filter *.mp3; /* 获取该目录下的所有文件 */ QFileInfoList files dirbsolutePath.entryInfoList(filter, QDir::Files); if(checked) { /* 如果目录存在 */ if (dirbsolutePath.exists()) { /* 遍历 */ for (int i 0; i files.count(); i) { music_MediaObjectInfo info; /* 使用utf-8编码 */ QString fileName QString::fromUtf8(files.at(i) .fileName() .replace(.mp3, ) .toUtf8() .data()); info.fileName fileName \n fileName.split(-).at(1); info.filePath QString::fromUtf8(files.at(i) .filePath() .toUtf8() .data()); /* 媒体列表添加歌曲 */ if (mediaPlaylist-addMedia(QUrl::fromLocalFile(info.filePath))) { /* 添加到容器数组里储存 */ mediaObjectInfo.append(info); /* 添加歌曲名字至列表 */ ui-listWidget-addItem(info.fileName); v.push_back(0); } else { qDebug() mediaPlaylist-errorString() .toUtf8().data() endl; qDebug() Error number: mediaPlaylist-error() endl; } } } } else ui-listWidget-clear(); } // 爱心按钮 void MusicPlayer::on_btn_favorite_clicked(bool checked) { if(checked) { v[CurrentIndex] 1; } else { v[CurrentIndex] 0; } } // 退出按钮 void MusicPlayer::on_btn_exit_clicked() { // this-close(); this-hide(); emit music_show_main(); }三、最终界面