思路:
自写一个类MyLrc,继承于QLabel,然后用线性渐变和绘图事件将歌词绘上去。
效果图:
流程:
一、将MyLrc设置成窗口无边框、背景透明
//设置窗体 无边框 置顶 setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); setAttribute(Qt::WA_TranslucentBackground); //背景透明
二、准备线性渐变
1 //还没播的 2 linearGradient.setStart(0, 10); 3 linearGradient.setFinalStop(0, 40); 4 linearGradient.setColorAt(0.1, QColor(14, 179, 255)); 5 linearGradient.setColorAt(0.5, QColor(114, 32, 255)); 6 linearGradient.setColorAt(0.9, QColor(14, 179, 255)); 7 8 //已经播过的 9 maskLinearGradient.setStart(0, 10); 10 maskLinearGradient.setFinalStop(0, 40); 11 maskLinearGradient.setColorAt(0.1, QColor(222, 54, 4)); 12 maskLinearGradient.setColorAt(0.5, QColor(255, 72, 16)); 13 maskLinearGradient.setColorAt(0.9, QColor(222, 54, 4));
三、重写绘图事件
1 //绘图事件 2 void MyLrc::paintEvent(QPaintEvent *e) 3 { 4 QPainter painter(this); 5 painter.setFont(myFont); //如果绘图的画家指定字体的话,那么该类也应该设置字体,这样用adjustSize()函数后宽度和高度才是正确的 6 //绘制底层黑色阴影图层 7 painter.setPen(Qt::black); 8 painter.drawText(1, 1, this->width(), this->height(), Qt::AlignLeft, text()); 9 //绘制未播放图层 10 painter.setPen(QPen(linearGradient, 0)); 11 painter.drawText(0, 0, this->width(), this->height(), Qt::AlignLeft, text()); 12 //绘制已播放图层 13 painter.setPen(QPen(maskLinearGradient, 0)); 14 painter.drawText(0, 0, drawWidth, this->height(), Qt::AlignLeft, text()); 15 }
四、重写鼠标事件,使得可以用鼠标进行移动歌词
1 //鼠标点击事件 2 void MyLrc::mousePressEvent(QMouseEvent *e) 3 { 4 if(e->button() == Qt::LeftButton) 5 { 6 movePointData.setX(e->pos().x()); 7 movePointData.setY(e->pos().y()); 8 } 9 } 10 11 //鼠标移动事件 12 void MyLrc::mouseMoveEvent(QMouseEvent *e) 13 { 14 if(e->buttons() & Qt::LeftButton) 15 { 16 this->move(e->globalPos() - movePointData); 17 } 18 } 19 20 //鼠标松开事件 这个是保证歌词永远完整的在屏幕显示 21 void MyLrc::mouseReleaseEvent(QMouseEvent *e) 22 { 23 if(e->button() == Qt::LeftButton) 24 { 25 if(this->x() < 0) 26 this->setGeometry(0, this->y(), this->width(), this->height()); 27 if(this->y() < 0) 28 this->setGeometry(this->x(), 0, this->width(), this->height()); 29 if(this->x() + this->width() > QApplication::desktop()->screenGeometry().width()) 30 this->setGeometry(QApplication::desktop()->screenGeometry().width() - this->width() 31 , this->y(), this->width(), this->height()); 32 if(this->y() + this->height() > QApplication::desktop()->screenGeometry().height()) 33 this->setGeometry(this->x(), QApplication::desktop()->screenGeometry().height() - this->height(), 34 this->width(), this->height()); 35 } 36 }
五、字幕文本设置
1 //设置字幕文本 2 3 myLrcShow->setText(myMediaPlayList->currentMedia().canonicalUrl().fileName()); 4 //每次设置文本都要用adjustSize()函数来更改label的高度和宽度 5 myLrcShow->adjustSize();
原文:https://www.cnblogs.com/zswd-hwj/p/12394514.html