QT小项目 - 音乐播放器

目录

零. 功能简介

一. 创建项目

二. 可视化创建页面

1.创建按钮

2.创建列表

3.创建文字

4.创建滑动块

5.对象查看器

三. cmake引入QMediaPlayer模块

1.打开CMakeLists.txt

2.添加

3.完整参考

四. 完整代码

1.widget.h

2.widget.cpp

3.main.cpp

五. 总结


零. 功能简介

这是一个基于 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 的图形界面开发有了更深入的理解和掌握,提升了对各种界面元素的运用能力以及对事件处理机制的熟悉程度。同时,也培养了我们在多媒体应用开发方面的实践能力和创新思维,为今后更复杂的项目开发奠定了坚实的基础。

  • 51
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一然明月(嵌入式)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值