最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于QT實現(xiàn)本地音樂播放器

 更新時間:2024年03月08日 14:23:55   作者:GrassFishStudio  
這篇文章主要為大家詳細介紹了如何基于QT實現(xiàn)簡單的本地音樂播放器,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

1.IDE

QTCreator

2.實驗

之前做的音樂播放器只做了一個界面,是因為跟的課程發(fā)現(xiàn)到后面需要付費,并且WINGW6.2.0運行QMediaPlayer時無法運行,會崩潰,現(xiàn)在退一步用

WINGW5.12.2做一個本地音樂播放器

3.記錄

(1)鼠標懸停,背景顏色改變

(2)listwidget以及水平滑塊

(3)雙擊播放音樂的實現(xiàn)

void Widget::on_listWidget_doubleClicked(const QModelIndex &index)    //雙擊播放指定音樂
{
    mediaplayer->setMedia(playlist[index.row()]);
    mediaplayer->play();
}

(4)打開文件夾的實現(xiàn)

void Widget::on_openfile_pb_clicked()   //打開文件按鈕按下
{
    //QMessageBox::information(this,"文件","打開文件");
    //打開對話框,讓用戶選擇音樂的存放路徑
    auto path=QFileDialog::getExistingDirectory(this,"選擇音樂所在的路徑","c:/Users/***/Desktop/music_path");   //打開指定文件夾***涉及個人信息
//    qInfo()<<path;   //打印剛才打開文件夾
    QDir dir(path);    //
    auto musiclist=dir.entryList(QStringList()<<"*.mp3"<<"*.wav");  //篩出mp3和wav文件
//  qInfo()<<musiclist;  //打印帥選后的音樂
    //把篩選出的文件在listwidget顯示出來
    ui->listWidget->addItems(musiclist);
    //默認選擇第一首音樂
    ui->listWidget->setCurrentRow(0);
    //把音樂完整路徑保存起來
    for(auto file : musiclist)
        playlist.append(QUrl::fromLocalFile(path+"/"+file));  //append附加
//    qInfo()<<playlist;   //將附加的音樂列表打印出來
}

(5)播放的實現(xiàn)

void Widget::on_playorpause_pb_clicked()    //播放或者暫停按下
{
    if(mediaplayer->state()!=QMediaPlayer::PlayingState)  //不處于播放狀態(tài)
    {
        //得到音樂索引
        int index=ui->listWidget->currentRow();
        //設置音樂路徑
        mediaplayer->setMedia(playlist[index]);
    }
    //判斷當前狀態(tài)
    switch(mediaplayer->state())
    {
     case QMediaPlayer::StoppedState:mediaplayer->play();break;
     case QMediaPlayer::PausedState:mediaplayer->play();break;  //停止則播放
     case QMediaPlayer::PlayingState:mediaplayer->pause();break;  //正在播放則暫停
 //    default:mediaplayer->play();break;
    }
}

(6)上一首,下一首的實現(xiàn)

void Widget::on_lastsong_pb_clicked()      //上一首
{
    int index=ui->listWidget->currentRow();
    if(index==0)    //如果在第一行
        ui->listWidget->setCurrentRow(ui->listWidget->count()-1);
    else
        ui->listWidget->setCurrentRow(index-1);
 
    mediaplayer->setMedia(playlist[ui->listWidget->currentRow()]);
    mediaplayer->play();
}
 
 
void Widget::on_next_song_pb_clicked()    //下一首
{
    int index=ui->listWidget->currentRow();
    if(index == (ui->listWidget->count()-1))  //如果在最后一首歌
        ui->listWidget->setCurrentRow(0);
    else
        ui->listWidget->setCurrentRow(index+1);
 
    mediaplayer->setMedia(playlist[ui->listWidget->currentRow()]);
    mediaplayer->play();
}

(7)獲取音樂總時長,當前播放進度,改變當前播放進度,改變音量的實現(xiàn)

    //獲取當前文件總播放時間
    connect(mediaplayer,&QMediaPlayer::durationChanged,this,[=](qint64 duration)
    {
        ui->total_playtime->setText(QString("%1:%2").arg(duration/1000/60,2,10,QChar('0')).arg(duration/1000%60,2,10,QChar('0')));//2為位寬,10為進制,QChar('0')為填充0
        ui->play_slider->setRange(0,duration);
    });
    //根據(jù)進度改變當前播放時間
    connect(mediaplayer,&QMediaPlayer::positionChanged,this,[=](qint64 position)
    {
        ui->now_playtime->setText(QString("%1:%2").arg(position/1000/60,2,10,QChar('0')).arg(position/1000%60,2,10,QChar('0')));//2為位寬,10為進制,QChar('0')為填充0
        ui->play_slider->setValue(position);
    });
    //拖動滑塊,讓音樂進度隨滑塊改變而改變
    connect(ui->play_slider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setPosition);
    //拖動滑塊,改變音量
    connect(ui->volume_slider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setVolume);

(8)總體運行效果

4.完整代碼

pro

QT       += core gui multimedia widgets
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
CONFIG += c++17
 
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 
SOURCES += \
    main.cpp \
    widget.cpp
 
HEADERS += \
    widget.h
 
FORMS += \
    widget.ui
 
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
 
RESOURCES += \
    resource.qrc

widget.h

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
#include <QPaintEvent>
#include <QMediaPlayer>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void paintEvent(QPaintEvent *);
private slots:
    void on_openfile_pb_clicked();
 
    void on_playorpause_pb_clicked();
 
    void on_lastsong_pb_clicked();
 
    void on_next_song_pb_clicked();
 
    void on_listWidget_doubleClicked(const QModelIndex &index);
 
 
    void on_close_pb_clicked();
 
    void on_about_pb_clicked();
 
private:
    Ui::Widget *ui;
    QMediaPlayer *mediaplayer;
    QList<QUrl> playlist;     //播放列表
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QMessageBox>   //消息提示
#include <QFileDialog>  //操作文件
#include <QDir>         //操作路徑
#include <QDebug>
//#include <QString>
#include <QMediaPlayer>
#include <QAudioOutput>  //音樂輸出
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
 
    this->setFixedSize(this->geometry().size());       //設置固定大小
    this->setWindowFlag(Qt::FramelessWindowHint);      //關閉窗口標題
 
    //定義一個媒體播放對象
    mediaplayer = new QMediaPlayer(this);
    //設置音量
    mediaplayer->setVolume(50);
    //獲取當前文件總播放時間
    connect(mediaplayer,&QMediaPlayer::durationChanged,this,[=](qint64 duration)
    {
        ui->total_playtime->setText(QString("%1:%2").arg(duration/1000/60,2,10,QChar('0')).arg(duration/1000%60,2,10,QChar('0')));//2為位寬,10為進制,QChar('0')為填充0
        ui->play_slider->setRange(0,duration);
    });
    //根據(jù)進度改變當前播放時間
    connect(mediaplayer,&QMediaPlayer::positionChanged,this,[=](qint64 position)
    {
        ui->now_playtime->setText(QString("%1:%2").arg(position/1000/60,2,10,QChar('0')).arg(position/1000%60,2,10,QChar('0')));//2為位寬,10為進制,QChar('0')為填充0
        ui->play_slider->setValue(position);
    });
    //拖動滑塊,讓音樂進度隨滑塊改變而改變
    connect(ui->play_slider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setPosition);
    //拖動滑塊,改變音量
    connect(ui->volume_slider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setVolume);
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::paintEvent(QPaintEvent*)    //重新定義畫布
{
    QPainter paint(this);
    paint.drawPixmap(0,0,width(),height(),QPixmap(":image/picture/background.jpg"));
}
 
void Widget::on_openfile_pb_clicked()   //打開文件按鈕按下
{
    //QMessageBox::information(this,"文件","打開文件");
    //打開對話框,讓用戶選擇音樂的存放路徑
    auto path=QFileDialog::getExistingDirectory(this,"選擇音樂所在的路徑","c:/Users/***/Desktop/music_path");   //打開指定文件夾
//    qInfo()<<path;   //打印剛才打開文件夾
    QDir dir(path);    //
    auto musiclist=dir.entryList(QStringList()<<"*.mp3"<<"*.wav");  //篩出mp3和wav文件
//  qInfo()<<musiclist;  //打印帥選后的音樂
    //把篩選出的文件在listwidget顯示出來
    ui->listWidget->addItems(musiclist);
    //默認選擇第一首音樂
    ui->listWidget->setCurrentRow(0);
    //把音樂完整路徑保存起來
    for(auto file : musiclist)
        playlist.append(QUrl::fromLocalFile(path+"/"+file));  //append附加
//    qInfo()<<playlist;   //將附加的音樂列表打印出來
}
 
 
void Widget::on_playorpause_pb_clicked()    //播放或者暫停按下
{
    if(mediaplayer->state()!=QMediaPlayer::PlayingState)  //不處于播放狀態(tài)
    {
        //得到音樂索引
        int index=ui->listWidget->currentRow();
        //設置音樂路徑
        mediaplayer->setMedia(playlist[index]);
    }
    //判斷當前狀態(tài)
    switch(mediaplayer->state())
    {
     case QMediaPlayer::StoppedState:mediaplayer->play();break;
     case QMediaPlayer::PausedState:mediaplayer->play();break;  //停止則播放
     case QMediaPlayer::PlayingState:mediaplayer->pause();break;  //正在播放則暫停
 //    default:mediaplayer->play();break;
    }
}
 
 
void Widget::on_lastsong_pb_clicked()      //上一首
{
    int index=ui->listWidget->currentRow();
    if(index==0)    //如果在第一行
        ui->listWidget->setCurrentRow(ui->listWidget->count()-1);
    else
        ui->listWidget->setCurrentRow(index-1);
 
    mediaplayer->setMedia(playlist[ui->listWidget->currentRow()]);
    mediaplayer->play();
}
 
 
void Widget::on_next_song_pb_clicked()    //下一首
{
    int index=ui->listWidget->currentRow();
    if(index == (ui->listWidget->count()-1))  //如果在最后一首歌
        ui->listWidget->setCurrentRow(0);
    else
        ui->listWidget->setCurrentRow(index+1);
 
    mediaplayer->setMedia(playlist[ui->listWidget->currentRow()]);
    mediaplayer->play();
}
 
 
 
void Widget::on_listWidget_doubleClicked(const QModelIndex &index)    //雙擊播放指定音樂
{
    mediaplayer->setMedia(playlist[index.row()]);
    mediaplayer->play();
}
 
void Widget::on_close_pb_clicked()     //離開按鈕按下
{
    close();
}
 
 
void Widget::on_about_pb_clicked()     //關于按鈕按下
{
    QMessageBox::about(this,"關于","應用:本地音樂播放器\r\n版本:1.0.0.0\r\n制作人:GrassFishStudio\r\n時間:2024年3月7日");
}
 

以上就是基于QT實現(xiàn)本地音樂播放器的詳細內(nèi)容,更多關于QT音樂播放器的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解為什么指針被譽為C語言靈魂

    詳解為什么指針被譽為C語言靈魂

    說到指針,就不可能脫離開內(nèi)存,學會指針的人分為兩種,一種是不了解內(nèi)存模型,另外一種則是了解。不了解的對指針的理解就停留在“指針就是變量的地址”這句話,會比較害怕使用指針,特別是各種高級操作。本文將帶你詳細了解C語言指針
    2021-06-06
  • 在C語言編程中使用變量的基礎教程

    在C語言編程中使用變量的基礎教程

    這篇文章主要介紹了在C語言編程中使用變量的基礎教程,特別需要注意C語言中的指針變量,需要的朋友可以參考下
    2016-02-02
  • OpenMP task construct 實現(xiàn)原理及源碼示例解析

    OpenMP task construct 實現(xiàn)原理及源碼示例解析

    這篇文章主要為大家介紹了OpenMP task construct 實現(xiàn)原理及源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • C++實現(xiàn)LeetCode(79.詞語搜索)

    C++實現(xiàn)LeetCode(79.詞語搜索)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(79.詞語搜索),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言中getchar()的原理以及易錯點解析

    C語言中getchar()的原理以及易錯點解析

    用getchar()函數(shù)讀取字符串時,字符串會存儲在輸入緩沖區(qū)中,包括輸入的回車字符,下面這篇文章主要給大家介紹了關于C語言中getchar()的原理以及易錯點解析的相關資料,需要的朋友可以參考下
    2022-03-03
  • Linux下用C語言實現(xiàn)推箱子游戲

    Linux下用C語言實現(xiàn)推箱子游戲

    這篇文章主要為大家詳細介紹了Linux下用C語言實現(xiàn)小老鼠推箱子的游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++面經(jīng)之什么是RAII面試問題解析

    C++面經(jīng)之什么是RAII面試問題解析

    這篇文章主要介紹了C++面經(jīng)之什么是RAII面試問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • C語言實現(xiàn)單鏈表的快速排序算法

    C語言實現(xiàn)單鏈表的快速排序算法

    大家好,本篇文章主要講的是C語言實現(xiàn)單鏈表的快速排序算法,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 利用C語言實現(xiàn)掃雷游戲

    利用C語言實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細介紹了利用C語言實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++檢測IPv4和IPv6地址合法性的兩種方法

    C++檢測IPv4和IPv6地址合法性的兩種方法

    本文介紹了兩種在C++中驗證IPv4和IPv6地址合法性的方法,推薦使用系統(tǒng)原生接口inet_pton函數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-01-01

最新評論

石门县| 龙南县| 威海市| 元阳县| 正镶白旗| 金湖县| 墨竹工卡县| 舒城县| 厦门市| 高阳县| 汉川市| 合川市| 安康市| 南京市| 凤城市| 溧阳市| 元氏县| 巴马| 台东市| 图片| 张北县| 确山县| 水城县| 西畴县| 邵阳县| 苏尼特左旗| 洛隆县| 亚东县| 滦平县| 中阳县| 沙湾县| 金寨县| 黔西| 滦平县| 邹城市| 鄂州市| 镇宁| 台江县| 马边| 香河县| 平原县|