大家好,欢迎来到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