首页 > 其他分享 >QT小项目 - 音乐播放器

QT小项目 - 音乐播放器

时间:2024-06-23 10:27:41浏览次数:3  
标签:播放器 Widget curPlayIndex QT void 音乐 QMediaPlayer ui mediaPayer

目录

零. 功能简介

一. 创建项目

二. 可视化创建页面

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

标签:播放器,Widget,curPlayIndex,QT,void,音乐,QMediaPlayer,ui,mediaPayer
From: https://blog.csdn.net/Cx20190420/article/details/139749612

相关文章

  • QT中子工程的创建,以及如何在含有库的子工程项目中引用主项目中的资源文件
    1、背景在qt中创建多项目类型,如下:CustomDll表示其中的一个动态库子项目;CustomLib表示其中的一个静态库子项目;MyWidget表示主项目窗口(main函数所在项目);2、qrc资源的共享如何在CustomDll和CustomLib等子项目中也同样使用MyWidget项目中的qrc资源呢???直接使用即可,因......
  • Qt版本选择01
    嵌入式推荐用Qt4.8,打包的程序小:Qt4.8.7是Qt4的终结版本,是Qt4系列版本中最稳定最经典的最后支持xp系统的长期支持版本:Qt5.6.3;Qt5.7.0是最后支持xp系统的非长期支持版本。最后提供mysql数据库插件的版本:Qt5.12.3。最后支持win7的版本:Qt5.15系列。Qt6不支持win7最后样式表性能最......
  • 短剧播放器:微信小程序uniApp引入短剧播放器
    微信小程序官方只提供了原生的DEMO,并没有说明uniApp,本文详细说明如何引入短剧播放器文章目录前言一、添加插件二、接入插件1.引入之前1.引入插件2.接入流程总结前言后续将逐步分享开发微短剧所遇到的各种坑以及解决办法,敬请关注不迷路,谢谢一、添加插件在小程......
  • Qt入门程序
    一、QtCreator简介    QtCreator为应用程序开发人员提供了一个完整的跨平台、集成开发环境(IDE)以便为桌面、嵌入式和移动设备平台(如Android和ios)创建应用程序。    QtCreator提供了在整个应用程序开发生命周期所需的工具,从创建项目到将应用程序部署......
  • qt 简单实验 一个可以向右侧拖拽缩放的矩形
    1.概要目的是设置一个可以拖拽缩放的矩形,这里仅用右侧的一个边模拟这个过程。就是为了抓住核心,这个便解决了,其他的边也是一样的。而这个更能体现原理。2.代码2.1 resizablerectangle.h#ifndefRESIZABLERECTANGLE_H#defineRESIZABLERECTANGLE_H#include<QWidget>#in......
  • AI与音乐:共创未来乐章还是终结艺术的颂歌?
    目录引言AI在音乐创作中的创新应用1.数据分析与智能作曲示例代码:使用Magenta库生成音乐2.实时创作与交互3.辅助创作与灵感激发AI对音乐艺术的潜在威胁1.标准化与同质化2.版权与伦理问题3.替代人类音乐家平衡与共存1.个性化与定制化的音乐体验2.跨领域融......
  • qt开发-08_layout 布局
    Qt提供了非常丰富的布局类,基本布局管理类包括:QBoxLayout、QGridLayout、QFormLayout和QStackedLayout。这些类都从QLayout继承而来,它们都来源于QObject(而不是QWidget)。创建更加复杂的布局,可以让它们彼此嵌套完成。其中QBoxLayout提供了水平和垂直的布局管理;QFormLa......
  • 基于springboot+vue音乐网站含文档附万字文档(源码+lw+部署文档+讲解等)
    前言......
  • Qt+OpenCV通用视觉框架全套源码,类似easyvision
    Qt+OpenCV通用视觉框架全套源码,类似easyvision。工具可扩展。所有算法均无封装,可以根据自己需要补充自己的工具。基于Qt5.12.12+VS2019+OpenCV开发实现,支持多相机多线程,每个工具都是单独的DLL,主程序通过公用的接口访问以及加载各个工具。包含涉及图像算法的工具、......
  • 使用mongodb、Kafka保存mqtt消息
    一、引言随着物联网技术的迅猛发展,大量的设备和传感器产生了海量的数据。本文利用了MQTT、Kafka和MongoDB各自的优点,满足实时数据处理和大规模数据存储的需求。如图:二、总结优点:1.可靠和解耦:Kafka的复制机制和持久化存储确保了数据在传输过程中的可靠性,即使某个节点......