1 Star 3 Fork 0

wujiamin2023/Qt-mscPlayer

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
lyricwidget.cpp 4.31 KB
一键复制 编辑 原始数据 按行查看 历史
Ollivander 提交于 2022-02-25 15:34 . ver1
#include "lyricwidget.h"
#include "ui_lyricwidget.h"
#include <QFile>
#include <QTextStream>
#include <QRegExp>
#include <QDebug>
#include <QMenu>
//#include <QClipboard>
#include <QMouseEvent>
//#include <QPlainTextEdit>
LyricWidget::LyricWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::LyricWidget)
{
ui->setupUi(this);
}
LyricWidget::~LyricWidget()
{
delete ui;
}
void LyricWidget::lyricHandle(const QString &lrcName)
{
QFile fe(lrcName);
if(!fe.open(QFile::ReadOnly)){
ui->label_4->setText(QStringLiteral("没有找到歌词文件"));
lyricString("没有找到歌词文件");
return;
}
QTextStream in(&fe);//有效解决乱码
// 获取全部歌词信息
QString allText = QString(in.readAll());
// 关闭歌词文件
fe.close();
// 将歌词按行分解为歌词列表
QStringList lines = allText.split("\n");
// 使用正则表达式将时间标签和歌词内容分离
QRegExp rx("\\[\\d{2}:\\d{2}\\.\\d{2}\\]");
foreach (QString oneLine, lines) {
// 先在当前行的歌词的备份中将时间内容清除,这样就获得了歌词文本
QString temp = oneLine;
temp.replace(rx, "");
// 然后依次获取当前行中的所有时间标签,并分别与歌词文本存入QMap中
int pos = rx.indexIn(oneLine, 0);
if (pos != -1) {
QString cap = rx.cap(0);
// 将时间标签转换为时间数值,以毫秒为单位
QRegExp regexp;
regexp.setPattern("\\d{2}(?=:)");
regexp.indexIn(cap);
int minute = regexp.cap(0).toInt();
regexp.setPattern("\\d{2}(?=\\.)");
regexp.indexIn(cap);
int second = regexp.cap(0).toInt();
regexp.setPattern("\\d{2}(?=\\])");
regexp.indexIn(cap);
int millisecond = regexp.cap(0).toInt();
qint64 totalTime = minute * 60000 + second * 1000 + millisecond * 10;
// 插入到lrcMap中
//qDebug()<<"insert"<<totalTime<<temp;
ircContent.push_back(std::make_pair(totalTime,temp));
}
}
// 如果lrcMap为空
if (ircContent.isEmpty()) {
ui->label_4->setText(QStringLiteral(" --- 歌词文件内容错误!"));
return;
}
showLyric(0);
}
void LyricWidget::clearLyric()
{
ircContent.clear();
ui->label->setText("");
ui->label_2->setText("");
ui->label_3->setText("");
ui->label_4->setText("");
ui->label_5->setText("");
ui->label_6->setText("");
ui->label_7->setText("");
}
//得到此时应该显示第几句
int LyricWidget::getIndex(const qint64 &position)
{
static int lyricId=0;
if(position>ircContent.at(lyricId).first){
//qDebug()<<position<<ircContent.at(lyricId).first<<ircContent.at(lyricId).second;
lyricId++;
}
return lyricId-1;
}
QString LyricWidget::getLyricText(int index)
{
if(index<0||index>=ircContent.count())
return "";
else return ircContent.at(index).second;
}
//void LyricWidget::mousePressEvent(QMouseEvent *event)
//{
// if(ircContent.isEmpty()) return;
// if(event->button()==Qt::RightButton){
// QMenu menu;QString str;
// QAction *act=menu.addAction("copy Lyrics");
// if(act==menu.exec(QCursor::pos())){
// QClipboard *board=QApplication::clipboard();
// for(auto &content:ircContent){
// str+=content.second+"\n";
// }
// board->setText(str);
// }
// }
//}
void LyricWidget::mouseDoubleClickEvent(QMouseEvent *event)
{
// plainText=new QPlainTextEdit(this);
// plainText->resize(this->size());
// plainText->setGeometry(this->rect());
// plainText->show();
// for(auto &content:ircContent){
// plainText->appendPlainText(content.second);
// }
}
void LyricWidget::showLyric(const qint64& position){
if(ircContent.isEmpty()) return;
int index=getIndex(position);
//qDebug()<<index;
emit lyricString(getLyricText(index));
ui->label->setText(getLyricText(index-3));
ui->label_2->setText(getLyricText(index-2));
ui->label_3->setText(getLyricText(index-1));
ui->label_4->setText(getLyricText(index));
ui->label_5->setText(getLyricText(index+1));
ui->label_6->setText(getLyricText(index+2));
ui->label_7->setText(getLyricText(index+3));
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/Ollivandergitee/msc-player.git
git@gitee.com:Ollivandergitee/msc-player.git
Ollivandergitee
msc-player
Qt-mscPlayer
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385