目录
零. 功能简介
这是一个基于 QT 开发的音乐播放器小项目。
该音乐播放器具备以下主要功能:
- 支持多种常见音乐格式的播放,如 MP3、WAV 等。
- 直观的用户界面,包括播放/暂停、停止、上一首、下一首等基本控制按钮。
- 显示当前播放歌曲的信息,如歌曲名称、歌手等。
- 可以调整音量大小。
- 具备播放列表功能,方便用户管理和选择要播放的歌曲。
- 可能还具备一些个性化设置,如进度调节等,以满足播放时滑动进度。
通过这个项目,用户可以轻松地播放自己喜欢的音乐,并享受便捷、流畅的音乐播放体验。它展示了 QT 在图形界面开发和多媒体处理方面的强大能力,为用户带来了一个简洁而实用的音乐播放解决方案。
效果图
一. 创建项目
或者
创建名称和目录一直下一步即可.
ps:我这里选中的构建系统时cmake 选中qmake添加模块的时候会更方便
二. 可视化创建页面
双击后缀为.ui的文件,会打开如下页面
1.创建按钮
左键选中PushButton,拖到页面里来.
右键,改变样式表,可以添加图片之类的.
主要用到的是点击事件
按下事件,写入事件代码(后面会有完整代码)
//文件按钮
void Widget::on_pushButton_clicked()
{
//打开文件对话框
auto path = QFileDialog::getExistingDirectory(this,"选择音乐文件目录","E:\\QTCode\\One\\MusicPlayer\\assect");
//获取路径下的音乐文件
QDir dir(path);
auto musilList = dir.entryList(QStringList()<<"*.mp3"<<"*.wav");
// qInfo()<<musilList;
ui->listWidget->addItems(musilList);
//默认选中第一个
ui->listWidget->setCurrentRow(0);
for(auto file:musilList){
playList.append(QUrl::fromLocalFile(path+"/"+file));
}
}
继续复制按钮,增加按钮事件
//上一曲
void Widget::on_pushButton_3_clicked()
{
curPlayIndex--;
if(curPlayIndex < 0)
{
curPlayIndex = playList.size()-1;
}
ui->listWidget->setCurrentRow(curPlayIndex);
mediaPayer->setSource(playList[curPlayIndex]);
mediaPayer->play();
}
//下一曲
//下一曲
void Widget::on_pushButton_5_clicked()
{
curPlayIndex++;
if(curPlayIndex >= playList.size())
{
curPlayIndex = 0;
}
ui->listWidget->setCurrentRow(curPlayIndex);
mediaPayer->setSource(playList[curPlayIndex]);
mediaPayer->play();
}
//播放按钮
void Widget::on_pushButton_4_clicked()
{
if(playList.isEmpty()){
return;
}
switch(mediaPayer ->playbackState()){
case QMediaPlayer ::PlaybackState::StoppedState:
{ //播放当前选中音乐
curPlayIndex = ui ->listWidget->currentRow();
mediaPayer ->setSource(playList[curPlayIndex]);
mediaPayer->play();
break;}
case QMediaPlayer ::PlaybackState::PlayingState:
{
mediaPayer->pause();
break;}
case QMediaPlayer ::PlaybackState::PausedState:
{
mediaPayer->play();
break;}
}
}
//音量控制按钮
bool volumeSliderShow = false;
void Widget::on_pushButton_6_clicked()
{
volumeSliderShow = !volumeSliderShow;
if(volumeSliderShow)
{
ui->volumeSlider ->show();
}
else
{
ui->volumeSlider ->hide();
}
}
2.创建列表
//列表双击事件
void Widget::on_listWidget_doubleClicked(const QModelIndex &index)
{
curPlayIndex = index.row();
mediaPayer->setSource(playList[curPlayIndex]);
mediaPayer->play();
}
//构造函数
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//播放音乐
audioOutput = new QAudioOutput(this);
mediaPayer = new QMediaPlayer(this);
mediaPayer ->setAudioOutput(audioOutput);
//获取时常
connect(mediaPayer,&QMediaPlayer::durationChanged,this,[=](qint64 duration){
ui->totalLabel->setText(QString("%1:%2").arg(duration/1000/60,2,10,QChar('0')).arg(duration/1000%60,2,10,QChar('0')));
//进度条最大值
ui->playCourseSlider ->setRange(0,duration);
});
//获取当前播放时常
connect(mediaPayer,&QMediaPlayer::positionChanged,this,[=](qint64 pos){
ui->curLabel->setText(QString("%1:%2").arg(pos/1000/60,2,10,QChar('0')).arg(pos/1000%60,2,10,QChar('0')));
//进度条当前值
ui->playCourseSlider ->setValue(pos);
});
//拖动滑块改变音乐进度
connect(ui->playCourseSlider,&QSlider::sliderMoved,mediaPayer,&QMediaPlayer::setPosition);
//隐藏volumeSlider
ui->volumeSlider->setRange(0,10);
// ui->volumeSlider->stepSize(0.1f);
ui->volumeSlider ->hide();
//拖动滑块改变声音大小
connect(ui->volumeSlider,&QSlider::sliderMoved,this,[=](qint64 duration){
audioOutput->setVolume(duration*0.1);
});
}
3.创建文字
//获取时常,总时长文字显示 和 进度条设置最大值
//获取时常
connect(mediaPayer,&QMediaPlayer::durationChanged,this,[=](qint64 duration){
ui->totalLabel->setText(QString("%1:%2").arg(duration/1000/60,2,10,QChar('0')).arg(duration/1000%60,2,10,QChar('0')));
//进度条最大值
ui->playCourseSlider ->setRange(0,duration);
});
//获取当前播放时常 当前时常文字显示, 设置进度条当前值
//获取当前播放时常
connect(mediaPayer,&QMediaPlayer::positionChanged,this,[=](qint64 pos){
ui->curLabel->setText(QString("%1:%2").arg(pos/1000/60,2,10,QChar('0')).arg(pos/1000%60,2,10,QChar('0')));
//进度条当前值
ui->playCourseSlider ->setValue(pos);
});
4.创建滑动块
两个文字里面添加弹簧,优化布局
//拖动滑块改变音乐进度
//拖动滑块改变音乐进度
connect(ui->playCourseSlider,&QSlider::sliderMoved,mediaPayer,&QMediaPlayer::setPosition);
//音量滑动块,初始化
//隐藏volumeSlider
ui->volumeSlider->setRange(0,10);
ui->volumeSlider ->hide();
//拖动滑块改变声音大小
connect(ui->volumeSlider,&QSlider::sliderMoved,this,[=](qint64 duration){
audioOutput->setVolume(duration*0.1);
});
//头文件引入
#include<QDebug>
#include<QFileDialog>
#include<QDir>
#include<QMediaPlayer>
#include<QAudioOutput>
5.对象查看器
三. cmake引入QMediaPlayer模块
1.打开CMakeLists.txt
2.添加
find_package(Qt6 REQUIRED COMPONENTS Multimedia)
target_link_libraries(MusicPlayer PRIVATE Qt6::Multimedia)
3.完整参考
cmake_minimum_required(VERSION 3.5)
project(MusicPlayer VERSION 0.1 LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
find_package(Qt6 REQUIRED COMPONENTS Multimedia)
set(PROJECT_SOURCES
main.cpp
widget.cpp
widget.h
widget.ui
)
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(MusicPlayer
MANUAL_FINALIZATION
${PROJECT_SOURCES}
assect.qrc
)
# Define target properties for Android with Qt 6 as:
# set_property(TARGET MusicPlayer APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
# ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
if(ANDROID)
add_library(MusicPlayer SHARED
${PROJECT_SOURCES}
)
# Define properties for Android with Qt 5 after find_package() calls as:
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
else()
add_executable(MusicPlayer
${PROJECT_SOURCES}
)
endif()
endif()
target_link_libraries(MusicPlayer PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
target_link_libraries(MusicPlayer PRIVATE Qt6::Multimedia)
# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.MusicPlayer)
endif()
set_target_properties(MusicPlayer PROPERTIES
${BUNDLE_ID_OPTION}
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
include(GNUInstallDirs)
install(TARGETS MusicPlayer
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(MusicPlayer)
endif()
四. 完整代码
1.widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QUrl>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class QAudioOutput;
class QMediaPlayer;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
void on_pushButton_4_clicked();
void on_pushButton_3_clicked();
void on_pushButton_5_clicked();
void on_listWidget_doubleClicked(const QModelIndex &index);
void on_pushButton_6_clicked();
private:
Ui::Widget *ui;
QList<QUrl> playList;
int curPlayIndex = 0;
QAudioOutput* audioOutput;
QMediaPlayer* mediaPayer;
};
#endif // WIDGET_H
2.widget.cpp
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QUrl>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class QAudioOutput;
class QMediaPlayer;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
void on_pushButton_4_clicked();
void on_pushButton_3_clicked();
void on_pushButton_5_clicked();
void on_listWidget_doubleClicked(const QModelIndex &index);
void on_pushButton_6_clicked();
private:
Ui::Widget *ui;
QList<QUrl> playList;
int curPlayIndex = 0;
QAudioOutput* audioOutput;
QMediaPlayer* mediaPayer;
};
#endif // WIDGET_H
3.main.cpp
保持的默认
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
五. 总结
在这个 QT 音乐播放器小项目中,我取得了丰富的收获和学习成果。
通过对按钮的运用,我们学会了如何创建和配置各种控制按钮,如播放、暂停、停止、上一首、下一首等,实现了便捷的交互操作。
文字的处理让我们能够清晰地展示歌曲信息、播放状态等内容,提升了用户的体验和对播放器的直观理解。
列表的实现帮助我们有效地管理播放列表,能够方便地添加、删除和选择歌曲,增加了播放器的功能和灵活性。
而对槽的深入学习和运用则是整个项目的关键核心。它将按钮的信号与相应的功能函数紧密连接,使得用户的操作能够准确地触发所需的行为,如播放歌曲、切换歌曲等。
通过这个项目,我们对 QT 的图形界面开发有了更深入的理解和掌握,提升了对各种界面元素的运用能力以及对事件处理机制的熟悉程度。同时,也培养了我们在多媒体应用开发方面的实践能力和创新思维,为今后更复杂的项目开发奠定了坚实的基础。
标签:播放器,Widget,curPlayIndex,QT,void,音乐,QMediaPlayer,ui,mediaPayer From: https://blog.csdn.net/Cx20190420/article/details/139749612