Qt–音乐播放器[亲测有效]

Qt–音乐播放器[亲测有效]文章目录一、功能介绍二、代码三、运行一、功能介绍能实现上一曲,下一曲能实现列表点击播放能实现暂停开始能实现歌词显示(有问题,先不改,后面再重写)原子的例程,功能没有实现完(我后面再弄)二、代码mainwindow.h#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QMediaPlayer>#include<QMediaPlaylist>#in

大家好,欢迎来到IT知识分享网。

一、功能介绍

能实现上一曲,下一曲
能实现列表点击播放
能实现暂停开始
能实现歌词显示(有问题,先不改,后面再重写)
原子的例程,功能没有实现完(我后面再弄)

二、代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QPushButton>
#include <QSlider>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QListWidget>
#include <QLabel>
#include <QSpacerItem>
#include <QDebug>
#include <QList>
#include <QTextEdit>

/* 媒体信息结构体 */
struct MediaObjectInfo{ 
   
    QString fileName; // 用于保存歌曲文件名
    QString filePath; // 用于保存歌曲文件路径
};

class MainWindow : public QMainWindow
{ 
   
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
/* 属性 */
private:
    QMediaPlayer *musicPlayer; // 媒体播放器,用于播放音乐
    QMediaPlaylist *mediaPlaylist; // 媒体列表
    QListWidget *musicListWidget; // 音乐列表
    QSlider *playProgressBar; // 播放进度条
    QPushButton *pushButton[7]; // 音乐播放按键
    QVBoxLayout *vBoxLayout[3]; // 垂直布局
    QHBoxLayout *hBoxLayout[4]; // 水平布局
    QWidget *vWidget[3]; // 垂直容器
    QWidget *hWidget[4]; // 水平容器
    QLabel *label[4]; // 标签文本
    QWidget *listMask; // 用于遮罩
    QList<QString> lyricsTextList; // 歌词文本列表
    QList<qint64> lyricsTimeList; // 歌词时间列表
    QTextEdit  *lyricsShowEdit; // 歌词显示文本框
    int        lyricsShowEditScrollBarValue; // 歌词显示区域滚动条的值

/* 函数 */
public:
    void initWidget(); // 初始化窗口
    void mediaPlayerInit(); // 媒体播放器初始化
    QVector<MediaObjectInfo> mediaObjectInfo; // 媒体信息存储
    void scanSongs(); // 扫描歌曲
    bool readLyricFile(QString lyricPath); // 读取歌词文件
    bool analysisLyricsFile(QString line); // 解析歌词文件
    void lyricsShow(); // 歌词显示
     // void resizeEvent(QResizeEvent *event); // 主窗体大小重设大小函数重写

/* 槽函数 */
private slots:
      void SltBtnPreviousClicked(); // 上一曲按键点击
      void SltBtnPlayClicked(); // 播放按键点击
      void SltBtnNextClicked(); // 下一曲按键点击
      void SltListWidgetClicked(QListWidgetItem*); // 列表点击
      void SltPlayProgressBarReleased(); // 播放进度条松开
      void SltMediaPlaylistCurrentIndexChanged(int); // 媒体列表项改变
      void SltMediaPlayerStateChanged(QMediaPlayer::State); // 媒体状态改变
      void SltMusicPlayerDurationChanged(qint64); // 媒体总时间改变
      void SltMediaPlayerPositionChanged(qint64); // 媒体播放位置改变
};
#endif // MAINWINDOW_H

IT知识分享网

mainwindow.cpp

IT知识分享网#include "mainwindow.h"
#include <QCoreApplication>
#include <QFileInfoList>
#include <QDir>
#include <QTextCodec>
#include <QScrollBar>

QString musicPath = "/home/luatao/qt/05_musicplayer/myMusic";

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{ 
   
    /* 初始化窗口 */
    initWidget();
    /* 媒体播放器初始化 */
    mediaPlayerInit();
    /* 扫描歌曲 */
    scanSongs();

    /* 按键信号槽连接 */
    connect(pushButton[0], SIGNAL(clicked()), this, SLOT(SltBtnPreviousClicked())); // 上一曲
    connect(pushButton[1], SIGNAL(clicked()), this, SLOT(SltBtnPlayClicked())); // 播放
    connect(pushButton[2], SIGNAL(clicked()), this, SLOT(SltBtnNextClicked())); // 下一曲

    /* 列表信号槽连接 */
    connect(musicListWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(SltListWidgetClicked(QListWidgetItem*)));
    /* 进度条信号槽连接 */
    connect(playProgressBar,SIGNAL(sliderReleased()), this, SLOT(SltPlayProgressBarReleased()));

    /* 媒体信号槽连接 */
    connect(mediaPlaylist,SIGNAL(currentIndexChanged(int)), this, SLOT(SltMediaPlaylistCurrentIndexChanged(int)));
    connect(musicPlayer,SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(SltMediaPlayerStateChanged(QMediaPlayer::State)));
    connect(musicPlayer,SIGNAL(durationChanged(qint64)), this, SLOT(SltMusicPlayerDurationChanged(qint64)));
    connect(musicPlayer,SIGNAL(positionChanged(qint64)), this, SLOT(SltMediaPlayerPositionChanged(qint64)));



    /* 失去焦点 */
    this->setFocus();

}

MainWindow::~MainWindow()
{ 
   
}

/** * @brief MainWindow::initWidget * 初始化窗口 */
void MainWindow::initWidget()
{ 
   

    this->setGeometry(0,0,800,480);
    QPalette pal; /* QPalette 对话框或控件的调色板 */

    /* 按键 初始化 */
    for(int i = 0; i< 7;i++)
        pushButton[i] = new QPushButton();
    /* 设置对象名称 */
    pushButton[0]->setObjectName("btn_previous"); // 上一曲
    pushButton[1]->setObjectName("btn_play"); // 播放
    pushButton[2]->setObjectName("btn_next"); // 下一曲
    pushButton[3]->setObjectName("btn_favorite"); // 喜欢
    pushButton[4]->setObjectName("btn_mode"); // 模式
    pushButton[5]->setObjectName("btn_menu"); // 菜单
    pushButton[6]->setObjectName("btn_volume"); // 音量
    /* 设置按键属性 该btn有可选择的属性 点击一下置为选择状态 */
    pushButton[1]->setCheckable(true);
    pushButton[3]->setCheckable(true);

    /* 标签初始化 */
    for(int i = 0; i< 4; i++)
        label[i] = new QLabel();

    /* 容器初始化 */
    for(int i = 0; i< 3; i++){ 
   
        /* 垂直容器 */
        vWidget[i] = new QWidget();
        vWidget[i]->setAutoFillBackground(true); // 设置自动填充背景
        /* 垂直布局 */
        vBoxLayout[i] = new QVBoxLayout();
    }
    for(int i = 0; i< 4; i++){ 
   
        /* 水平容器 */
        hWidget[i] = new QWidget();
        hWidget[i]->setAutoFillBackground(true);
        /* 水平布局 */
        hBoxLayout[i] = new QHBoxLayout();
    }

    /* 播放进度条 */
    playProgressBar = new QSlider(Qt::Horizontal); // 水平方向进度条
    playProgressBar->setMinimumSize(300,15); // 最小窗口值 也就是尺寸大小 宽300 高15
    playProgressBar->setMaximumHeight(15);
    playProgressBar->setObjectName("playProgressBar");

    /* 音乐列表 */
    musicListWidget = new QListWidget();
    musicListWidget->setObjectName("musicListWidget");
    musicListWidget->resize(310,265); /* 设置大小 */
    musicListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 一直屏蔽垂直滚动条
    musicListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 屏蔽水平滚动条

    /* 列表遮罩 */
    listMask = new QWidget(musicListWidget);  // 在窗口界面添加音乐列表
    listMask->setMinimumSize(310,50);
    listMask->setMinimumHeight(50);
    listMask->setObjectName("listMask");
    listMask->setGeometry(0,musicListWidget->height() - 50, 310, 50);  // 设置串口的位置和大小



    /* 总体布局 分成左右两个垂直布局 */
    vWidget[0]->setMinimumSize(310, 480); // 窗口
    vWidget[0]->setMaximumWidth(310);
    vWidget[1]->setMinimumSize(320, 480);

    /* 创建空白区域 大小为70,480 空白区不能小于Minimum 不能大于Maximum*/
    QSpacerItem *hSpacer0 = new QSpacerItem(70, 480, QSizePolicy::Minimum, QSizePolicy::Maximum);
    QSpacerItem *hSpacer1 = new QSpacerItem(65, 480, QSizePolicy::Minimum, QSizePolicy::Maximum);
    QSpacerItem *hSpacer2 = new QSpacerItem(60, 480, QSizePolicy::Minimum, QSizePolicy::Maximum);

// vWidget[0]->setStyleSheet("background-color:black;"); // 设置窗口的背景 调试使用
// vWidget[1]->setStyleSheet("background-color:red;");
    hBoxLayout[0]->addSpacerItem(hSpacer0);
    hBoxLayout[0]->addWidget(vWidget[0]);
    hBoxLayout[0]->addSpacerItem(hSpacer1);
    hBoxLayout[0]->addWidget(vWidget[1]);
    hBoxLayout[0]->addSpacerItem(hSpacer2);
    /* setContentsMargins 设置左侧、顶部、右侧、底部边距*/
    hBoxLayout[0]->setContentsMargins(0,0,0,0);

    hWidget[0]->setLayout(hBoxLayout[0]); // hWidget[0]是主窗口
    setCentralWidget(hWidget[0]); // 设置中间显示


    /*左边的布局 添加了音乐列表 和一个水平布局 */
    musicListWidget->setMinimumSize(310, 265);
    hWidget[1]->setMinimumSize(310, 80);
    hWidget[1]->setMaximumHeight(80);
    label[0]->setMinimumSize(310, 95);
    label[0]->setMaximumHeight(95);
    QSpacerItem *vSpacer0 = new QSpacerItem(310, 10, QSizePolicy::Minimum, QSizePolicy::Maximum);
    QSpacerItem *vSpacer1 = new QSpacerItem(310, 30, QSizePolicy::Minimum, QSizePolicy::Maximum);

    //label[0]->setText("你好");
    vBoxLayout[0]->addWidget(label[0]);
    vBoxLayout[0]->addWidget(musicListWidget);
    vBoxLayout[0]->addSpacerItem(vSpacer0);
    vBoxLayout[0]->addWidget(hWidget[1]);
    vBoxLayout[0]->addSpacerItem(vSpacer1);
    vBoxLayout[0]->setContentsMargins(0,0,0,0);

    vWidget[0]->setLayout(vBoxLayout[0]);


    /* 左边的水平布局 添加了3个按键 */
    for(int i = 0; i< 3; i++)
        pushButton[i]->setMinimumSize(80,80);

    /* Expanding 可自由伸缩 */
    QSpacerItem *hSpacer3 = new QSpacerItem(40, 80, QSizePolicy::Expanding, QSizePolicy::Expanding);
    QSpacerItem *hSpacer4 = new QSpacerItem(40, 80, QSizePolicy::Expanding, QSizePolicy::Expanding);

    hBoxLayout[1]->addWidget(pushButton[0]);
    hBoxLayout[1]->addSpacerItem(hSpacer3);
    hBoxLayout[1]->addWidget(pushButton[1]);
    hBoxLayout[1]->addSpacerItem(hSpacer4);
    hBoxLayout[1]->addWidget(pushButton[2]);
    hBoxLayout[1]->setContentsMargins(0,0,0,0);

    hWidget[1]->setLayout(hBoxLayout[1]);


    /* 右边的垂直布局 添加了label 滚动条 和一个垂直布局 */
    QSpacerItem *vSpacer2 = new QSpacerItem(320, 40, QSizePolicy::Minimum, QSizePolicy::Maximum);
    QSpacerItem *vSpacer3 = new QSpacerItem(320, 20, QSizePolicy::Minimum, QSizePolicy::Maximum);
    QSpacerItem *vSpacer4 = new QSpacerItem(320, 30, QSizePolicy::Minimum, QSizePolicy::Maximum);

// label[1]->setMinimumSize(320, 320);
// QImage Image;
// Image.load(":/images/cd.png");
// QPixmap pixmap = QPixmap::fromImage(Image);

// int width = 320, height = 320;
// QPixmap fitpixmap = pixmap.scaled(width,height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
// label[1]->setPixmap(fitpixmap);
// label[1]->setAlignment(Qt::AlignCenter); // 居中对齐

    lyricsShowEdit = new QTextEdit(this); // 文本区域
    lyricsShowEdit->setMinimumSize(320,320);
    lyricsShowEdit->setStyleSheet("background-color:transparent;color:red"); // 设置背景为黑色
    lyricsShowEdit->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);// 隐藏垂直滚动条
    lyricsShowEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);// 隐藏水平滚动条
    lyricsShowEdit->setFontPointSize(16); // 设置字体大小

    vWidget[2]->setMinimumSize(300, 80);
    vWidget[2]->setMaximumHeight(80);

    vBoxLayout[1]->addSpacerItem(vSpacer2);
    // vBoxLayout[1]->addWidget(label[1]);
    vBoxLayout[1]->addWidget(lyricsShowEdit);
    vBoxLayout[1]->addSpacerItem(vSpacer3);
    vBoxLayout[1]->addWidget(playProgressBar);
    vBoxLayout[1]->addWidget(vWidget[2]);
    vBoxLayout[1]->addSpacerItem(vSpacer4);
    vBoxLayout[1]->setContentsMargins(0,0,0,0);

    vWidget[1]->setLayout(vBoxLayout[1]);

    /* 右边的垂直布局 添加了两个水平布局 */
    QSpacerItem *vSpacer5 = new QSpacerItem(310, 10, QSizePolicy::Minimum, QSizePolicy::Maximum);
    hWidget[2]->setMinimumSize(320, 20);
    hWidget[3]->setMinimumSize(320, 60);

    vBoxLayout[2]->addWidget(hWidget[2]);
    vBoxLayout[2]->addSpacerItem(vSpacer5);
    vBoxLayout[2]->addWidget(hWidget[3]);
    vBoxLayout[2]->setContentsMargins(0,0,0,0);

    vWidget[2]->setLayout(vBoxLayout[2]);

    /* 右边的一个水平布局 添加了两个label 表示歌曲播放的时间 */
    QFont font;
    font.setPixelSize(10);

    /* 设置文本标签 */
    label[0]->setText("luatao Music!");
    label[2]->setText("00:00");
    label[3]->setText("00:00");

    label[2]->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    label[3]->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);

    label[2]->setAlignment(Qt::AlignRight); // 右对齐
    label[3]->setAlignment(Qt::AlignLeft); //
    label[2]->setFont(font);
    label[3]->setFont(font);

    pal.setColor(QPalette::WindowText, Qt::white); // 设置文字的颜色白色
    label[0]->setPalette(pal);
    label[2]->setPalette(pal);
    label[3]->setPalette(pal);

    hBoxLayout[2]->addWidget(label[2]);
    hBoxLayout[2]->addWidget(label[3]);
    hBoxLayout[2]->setContentsMargins(0,0,0,0);

    hWidget[2]->setLayout(hBoxLayout[2]);

    /* 右边的一个水平布局 添加4个按键 */

    QSpacerItem *hSpacer5 = new QSpacerItem(0, 60, QSizePolicy::Minimum, QSizePolicy::Maximum);
    QSpacerItem *hSpacer6 = new QSpacerItem(80, 60, QSizePolicy::Minimum, QSizePolicy::Maximum);
    QSpacerItem *hSpacer7 = new QSpacerItem(80, 60, QSizePolicy::Minimum, QSizePolicy::Maximum);
    QSpacerItem *hSpacer8 = new QSpacerItem(80, 60, QSizePolicy::Minimum, QSizePolicy::Maximum);


    for(int i = 3; i < 7; i++){ 
   
        pushButton[i]->setMinimumSize(25, 25);
        pushButton[i]->setMaximumSize(25, 25);
    }

    hBoxLayout[3]->addSpacerItem(hSpacer5);
    hBoxLayout[3]->addWidget(pushButton[3]);
    hBoxLayout[3]->addSpacerItem(hSpacer6);
    hBoxLayout[3]->addWidget(pushButton[4]);
    hBoxLayout[3]->addSpacerItem(hSpacer7);
    hBoxLayout[3]->addWidget(pushButton[5]);
    hBoxLayout[3]->addSpacerItem(hSpacer8);
    hBoxLayout[3]->addWidget(pushButton[6]);
    hBoxLayout[3]->setContentsMargins(0,0,0,0);
    hBoxLayout[3]->setAlignment(Qt::AlignCenter);

    hWidget[3]->setLayout(hBoxLayout[3]);
}


/** * @brief MainWindow::mediaPlayerInit * 媒体播放器初始化 */
void MainWindow::mediaPlayerInit()
{ 
   
    musicPlayer = new QMediaPlayer(this); // 媒体播放器
    mediaPlaylist = new QMediaPlaylist(this); // 媒体列表

    /* 清空播放器列表 */
    mediaPlaylist->clear();
    /* 设置音乐播放器的列表为mediaplaylist */
    musicPlayer->setPlaylist(mediaPlaylist);
    /* 设置播放模式,loop是列循环 */
    mediaPlaylist->setPlaybackMode(QMediaPlaylist::Loop);
}

/** * @brief MainWindow::scanSongs * 扫描歌曲 */
void MainWindow::scanSongs()
{ 
   
   // QDir dir(QCoreApplication::applicationDirPath() + "/myMusic"); // 文件目录
    QDir dir(musicPath); // 文件目录
    //qDebug() << QCoreApplication::applicationDirPath() + "/myMusic" << endl;
    QDir dirbsolutePath(dir.absolutePath()); // 绝对路径
    /* 如果目录存在 */
    if(dirbsolutePath.exists()){ 
   
        /* 定义过滤器 */
        QStringList filter;
        /* 筛选所有包含.mp3后缀的文件 */
        filter << "*.mp3";
        /* 获取该目录下所有的文件 */
        QFileInfoList files = dirbsolutePath.entryInfoList(filter, QDir::Files);
        //qDebug()<<files.count()<<endl;
        /* 遍历 */
        for(int i = 0; i< files.count(); i++){ 
   

            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.fileName = fileName; // 这里格式化显示的歌曲名
            info.filePath = QString::fromUtf8(files.at(i).filePath().toUtf8().data()); // 获取文件名
            //qDebug() << fileName << endl;
            /* 媒体列表添加歌曲 */
            if(mediaPlaylist->addMedia(QUrl::fromLocalFile(info.filePath))){ 
   
                /* 添加到容器数组里储存 */
                mediaObjectInfo.append(info);
                /* 添加歌曲名至列表 */
                musicListWidget->addItem(info.fileName);

               // qDebug() << info.fileName << endl;
            }else{ 
   
                qDebug() << "Error number:" << mediaPlaylist->error() << endl;
            }
        }

    }else
      qDebug() << "path not exist!" << endl;  // 路径不存在
}


/** * @brief MainWindow::btn_previous_clicked * 上一曲点击槽函数 */
void MainWindow::SltBtnPreviousClicked()
{ 
   
    musicPlayer->stop(); // 停止当前音乐
    int count = mediaPlaylist->mediaCount(); // 判断音乐的个数
    if(count == 0)
        return ;
    /* 跳转到列表的上一个 */
    mediaPlaylist->previous();
    musicPlayer->play(); // 播放音乐
}

/* 播放音乐点击槽函数 */
void MainWindow::SltBtnPlayClicked()
{ 
   
    int state = musicPlayer->state(); // 获取播放器的状态

    switch(state){ 
   
        case QMediaPlayer::StoppedState:
            /* 播放 */
            musicPlayer->play();
           // qDebug() << "StoppedState" << endl;
            break;
        case QMediaPlayer::PlayingState:
            /* 暂停 */
            musicPlayer->pause();
          // qDebug() << "PlayingState" << endl;
            break;
        case QMediaPlayer::PausedState:
            /* 播放 */
            musicPlayer->play();
           // qDebug() << "PausedState" << endl;
            break;
    }
}

/* 下一曲点击槽函数 */
void MainWindow::SltBtnNextClicked()
{ 
   
    musicPlayer->stop(); // 停止播放
    int count = mediaPlaylist->mediaCount(); // 判断音乐的个数
    if(count == 0)
        return ;
    /* 跳转到列表的下一个 */
    mediaPlaylist->next();
    musicPlayer->play();
}


/** * @brief MainWindow::SltListWidgetClicked * 歌曲列表点击 播放此项 * @param item */
void MainWindow::SltListWidgetClicked(QListWidgetItem  *item)
{ 
   
    musicPlayer->stop();
    mediaPlaylist->setCurrentIndex(musicListWidget->row(item)); // 播放点击的音乐
    musicPlayer->play();
}


/** * @brief MainWindow::durationSliderReleased * 根据滑条设置媒体播放的位置 ,也就是通过进度条控制播放的位置 */
void MainWindow::SltPlayProgressBarReleased()
{ 
   
    /* 设置媒体播放的位置 */
    musicPlayer->setPosition(playProgressBar->value() * 1000); // ms为单位
}

/** * @brief MainWindow::SltMediaPlaylistCurrentIndexChanged * 媒体列表当前下标改变 * @param index */
void MainWindow::SltMediaPlaylistCurrentIndexChanged(int index)
{ 
   
    if(index == -1)
        return ;
    /* 设置列表正在播放的项 */
    musicListWidget->setCurrentRow(index); // 当上一曲或者下一曲的时候歌曲列表显示出来
}

/** * @brief MainWindow::SltMediaPlayerStateChanged * 媒体播放的状态改变 * @param state */
void MainWindow::SltMediaPlayerStateChanged(QMediaPlayer::State state)
{ 
   

    switch (state) { 
   
        case QMediaPlayer::StoppedState:
            pushButton[1]->setChecked(false); // 播放按键的状态为不可选
            // qDebug() << "StoppedState1" << endl;
            break;
        case QMediaPlayer::PlayingState:  // 正在播放
            pushButton[1]->setChecked(true);
            // qDebug() << "PlayingState1" << endl;
            break;
        case QMediaPlayer::PausedState:
            pushButton[1]->setChecked(false);
           // qDebug() << "PausedState1" << endl;
            break;
    }
}

/** * @brief MainWindow::SltMusicPlayerDurationChanged * 媒体播放长度发生变化 显示时间标签改变 * @param duration */
void MainWindow::SltMusicPlayerDurationChanged(qint64 duration)
{ 
   
    playProgressBar->setRange(0, duration / 1000); // duration为ms 进度条设置显示
    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);

    /* 显示媒体总长度时间 */
    label[3]->setText(mediaDuration);

   /* 加载歌词 */
    /* 获取此歌曲的歌词文件 */
    int index = mediaPlaylist->currentIndex(); // 获取当前媒体列表的位置
    QListWidgetItem *item = musicListWidget->item(index);  // 从歌曲列表中找到此歌曲项
    QString musicName = item->text().left(item->text().lastIndexOf(".")); // 获取.左边的数据
    if(!readLyricFile(musicPath + "/" + musicName + ".lrc")){ 
    // 打开这个歌词文件
        qDebug() << "未检测到歌词文件" <<endl;
    }
    lyricsShow(); // 显示歌词
}


/** * @brief MainWindow::SltMediaPlayerPositionChanged * 媒体播放位置显示 一直更新 显示当前播放位置 * @param position */
void MainWindow::SltMediaPlayerPositionChanged(qint64 position)
{ 
   
    if(!playProgressBar->isSliderDown()) // 如果滑块没有按下
        playProgressBar->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);

    /* 显示当前播放的时间 */
    label[2]->setText(mediaPosition);

    /* 下面不对 ,应该按时间来计算 如果改变滚动条的值, 下面将不再有意义 */

    /* 显示歌词 */
    /* position:是当前播放的时间 单位为ms 判断这个时间和lyricsTimeList的时间的大小 如果position == lyricsTimeList 那么就显示这一句歌词 */
    int index = 0;

    for(qint64 mstime:lyricsTimeList){ 
   
        /* "[00:00.00]听雪恋歌 - CH2" "[00:13.30]词:吕泓瑾" "[00:26.61]曲:吕泓瑾"*/
        index ++; // 记录当前项的下标
          // qDebug() << "mstime" << mstime << endl; // 输出时间
          // qDebug() << "position / 10 * 10" << position / 1000 * 1000 << endl; // 输出时间
        if(mstime / 1000 * 1000   == (position / 1000 * 1000)){ 
   
            // qDebug() << "pipei"<< endl; // 输出时间
            /* 播放当前歌词 歌词往上移动一行 */
            int value = lyricsShowEdit->verticalScrollBar()->value(); // 获取滚动条的值
            int count = lyricsTextList.count(); // 获取歌词总共的行数
            int accumulationValue = lyricsShowEditScrollBarValue / count + 1; // 每一行歌曲占的滚动条的值
        // qDebug() << "lyricsShowEditScrollBarValue" << lyricsShowEditScrollBarValue <<endl;
        // qDebug() << "count" << count <<endl;
        // qDebug() << "accumulationValue" << accumulationValue <<endl;
            lyricsShowEdit->verticalScrollBar()->setValue(value + accumulationValue * index); // 移动
            break;
        }
    }
}

/** * @brief MainWindow::readLyricFile * 读取歌词文件 * @param lyricPath 歌词文件路径 */
bool MainWindow::readLyricFile(QString lyricPath)
{ 
   
    lyricsTextList.clear();
    lyricsTimeList.clear(); // 清空列表

    QFile file(lyricPath);
    if(!file.exists()){ 
    // 文件路径不存在
        lyricsTextList.push_back("未检测到歌词文件"); // 添加到歌词文本列表
        return false;
    }
    file.open(QIODevice::ReadOnly | QIODevice::Text); // 只读方式打开文件

// QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
// QTextCodec::setCodecForLocale(utf8);
// QTextCodec* gbk = QTextCodec::codecForName("gbk");


    QTextStream in(&file);
    in.setCodec(QTextCodec::codecForName("GBK"));//让文件以UTF-8的方式译码。

    QString line = "";
    while((line = in.readLine()) > 0){ 
    // 读取一行数据
        /* gbk转utf-8 */
// //1. gbk to unicode
// QString strUnicode = gbk->toUnicode(line.toLocal8Bit().data());
// //2. unicode -> utf-8
// QByteArray utf8_bytes = utf8->fromUnicode(strUnicode);
        qDebug() << line << endl;
        analysisLyricsFile(line);//解析歌词文件
    }
    file.close(); // 关闭文件
    return true;
}

/** * @brief analysisLyricsFile * 解析歌词文件 如果时间精确到s的话会有重复 这里精确到s后面1位 * @param line * @return */
bool MainWindow::analysisLyricsFile(QString line)
{ 
   

    if(line == NULL || line.isEmpty()){ 
    // 一行数据为空
        qDebug() << "this line is empty!";
        return false;
    }

    /* \[(\d+)?:(\d+)?\.(\d+)?\](.*)? * [(数字)?:(数字)?.(数字)](.*)? */
    QRegularExpression regularExpression("\\[(\\d+)?:(\\d+)?\\.(\\d+)?\\](.*)?"); // \[(\d+)?:(\d+)?(\.\d+)?\](.*)?

        QRegularExpressionMatch match;
        match = regularExpression.match(line, 0); // 从第0个字符开始匹配
        if(match.hasMatch()) { 
    // 数据匹配成功
// qDebug() << match.captured(3).toInt() * 10 << ' ';
            qint64 totalTime = match.captured(1).toInt() * 60000 + match.captured(2).toInt() * 1000 + match.captured(3).toInt() * 10;  // 转化为ms /* 计算该时间点毫秒数 */
            QString currentText =QString::fromStdString(match.captured(4).toStdString());  // 获取歌词文本
            lyricsTextList.push_back(currentText); // 将当前文本添加到文本列表
            lyricsTimeList.push_back(totalTime); // 将当前时间添加到时间列表
            return true;
        }
        return false;
}

/** * @brief MainWindow::lyricsShow * 歌词显示 */
void MainWindow::lyricsShow()
{ 
   
    lyricsShowEdit->clear(); // 加载之前需要先清除文本区域的内容
    for(QString str:lyricsTextList){ 
    // 遍历
        lyricsShowEdit->append(str); // 显示
        //qDebug() << str << endl;
     }
    /* 获取滚动条的最大值 */
    lyricsShowEditScrollBarValue = lyricsShowEdit->verticalScrollBar()->value();
    qDebug() << "lyricsShowEditScrollBarValue" << lyricsShowEditScrollBarValue << endl;
    /* 返回到最上面 */
    lyricsShowEdit->verticalScrollBar()->setValue(0); // 移动
}

///* 重新绘制窗口大小 */
//void MainWindow::resizeEvent(QResizeEvent *event)
//{ 
   
// Q_UNUSED(event);
// listMask->setGeometry(0,listWidget->height() - 50, 310, 50);
//}

main.cpp

#include "mainwindow.h"

#include <QApplication>
#include <QFile>

int main(int argc, char *argv[])
{ 
   
    QApplication a(argc, argv);
    /* 指定文件 */
    QFile file(":/style.qss");
    /* 判断文件是否存在 */
    if(file.exists()){ 
   
        /* 以只读的方式打开文件 */
        file.open(QFile::ReadOnly);
        /* 以字符串的方式保存读出的结果 */
        QString styleSheet = QLatin1String(file.readAll());
        /* 设置全局样式 */
        qApp->setStyleSheet(styleSheet);
        /* 关闭文件 */
        file.close();
    }
    MainWindow w;
    w.show();
    return a.exec();
}

style.qss

IT知识分享网QWidget{
    background: "#25242a"  /* 设置窗体背景颜色 */
}

QWidget#listMask {
    border-image: url(:/images/mask.png);
    background-color: transparent;
}

QListWidget#musicListWidget {
    color:white;
    font-size: 15px;
    border:none;
}

QListWidget#musicListWidget:item:active {
    background: transparent;
}

QListWidget#musicListWidget:item {
    background: transparent;
    height:60;
}

QListWidget#musicListWidget:item:selected {
    color:#5edcf3;
    background: transparent;
}

QListWidget#musicListWidget:item:hover {
    background: transparent;
    color:#5edcf3;
    border:none;
}

/* 设置按键的图片 */

QPushButton#btn_play {
    border-image:url(:/images/btn_play1.png);
}

QPushButton#btn_play:hover {
    border-image:url(:/images/btn_play2.png);
}

QPushButton#btn_play:checked {
    border-image:url(:/images/btn_pause1.png);
}

QPushButton#btn_play:checked:hover {
    border-image:url(:/images/btn_pause2.png);
}

QPushButton#btn_previous {
    border-image:url(:/images/btn_previous1.png);
}

QPushButton#btn_previous:hover {
    border-image:url(:/images/btn_previous2.png);
}

QPushButton#btn_next {
    border-image:url(:/images/btn_next1.png);
}

QPushButton#btn_next:hover {
    border-image:url(:/images/btn_next2.png);
}

QPushButton#btn_favorite {
    border-image:url(:/images/btn_favorite_no.png);
}

QPushButton#btn_favorite:checked {
    border-image:url(:/images/btn_favorite_yes.png);
}

QPushButton#btn_menu {
    border-image:url(:/images/btn_menu1.png);
}

QPushButton#btn_menu:hover {
    border-image:url(:/images/btn_menu2.png);
}

QPushButton#btn_mode {
border-image:url(:/images/btn_listcircle1.png);
}

QPushButton#btn_mode:hover {
    border-image:url(:/images/btn_listcircle2.png);
}

QPushButton#btn_mode {
    border-image:url(:/images/btn_listcircle1.png);
}

QPushButton#btn_mode:hover {
border-image:url(:/images/btn_listcircle2.png);
}

QPushButton#btn_volume {
    border-image:url(:/images/btn_volume1.png);
}

QPushButton#btn_volume:hover {
    border-image:url(:/images/btn_volume2.png);
}

QSlider#playProgressBar:handle:horizontal {
    border-image:url(:/images/handle.png);
}

QSlider#playProgressBar:sub-page:horizontal {
    border-image:url(:/images/sub-page.png);
}

三、运行

在这里插入图片描述
在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/13032.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信