代码拉取完成,页面将自动刷新
#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));
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。