如何在 pyqt 中实现桌面歌词

🚀 优质资源分享 🚀

学习路线指引(点击解锁) 知识定位 人群定位
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

前言

酷狗、网抑云和 QQ 音乐都有桌面歌词功能,这篇博客也将使用 pyqt 实现桌面歌词功能,效果如下图所示:

代码实现

桌面歌词部件 LyricWidgetpaintEvent 中绘制歌词。我们可以直接使用 QPainter.drawText 来绘制文本,但是通过这种方式无法对歌词进行描边。所以这里更换为 QPainterPath 来实现,使用 QPainterPath.addText 将歌词添加到绘制路径中,接着使用 Qainter.strokePath 进行描边,Qainter.fillPath 绘制歌词,这里的绘制顺序不能调换。

对于歌词的高亮部分需要特殊处理,假设当前高亮部分的宽度为 w,我们需要对先前绘制歌词的 QPainterPath 进行裁剪,只留下宽度为 w 的部分,此处通过 QPainterPath.intersected 计算与宽度为 w 的矩形路径的交集来实现裁剪。

对于高亮部分的动画,我们既可以使用传统的 QTimer,也可以使用封装地更加彻底的 QPropertyAnimation 来实现(本文使用后者)。这里需要进行动画展示的是高亮部分,也就是说我们只需改变“高亮宽度”这个属性即可。PyQt 为我们提供了 pyqtProperty,类似于 python 自带的 property,使用 pyqtProperty 可以给部件注册一个属性,该属性可以搭配动画来食用。

除了高亮动画外,我们还在 LyricWidget 中注册了滚动动画,用于处理歌词长度大于视口宽度的情况。

复制# coding:utf-8
from PyQt5.QtCore import QPointF, QPropertyAnimation, Qt, pyqtProperty
from PyQt5.QtGui import (QColor, QFont, QFontMetrics, QPainter, QPainterPath,
                         QPen)
from PyQt5.QtWidgets import QWidget


config = {
    "lyric.font-color": [255, 255, 255],
    "lyric.highlight-color": [0, 15
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答你的问题。在PyQt,可以使用QPropertyAnimation类来实现上拉隐藏动画效果。具体实现方式如下: 1. 创建一个QWidget对象,作为要隐藏的控件。 2. 创建一个QPropertyAnimation对象,设置用于动画的属性名称(比如高度)以及动画的持续时间。 3. 实现一个槽函数,用于触发动画效果。在该槽函数,调用QPropertyAnimation对象的start()方法,让动画开始执行。 4. 在槽函数,使用QVariant对象来设置动画的起始值和结束值。比如,将控件的高度从当前值逐渐缩小到0,就可以实现上拉隐藏的效果。 下面是一个示例代码,用于实现一个按钮,点击时可以触发上拉隐藏动画效果: ```Python from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class Widget(QWidget): def __init__(self, parent=None): super(Widget, self).__init__(parent) # 创建一个按钮 self.button = QPushButton('Click me') self.button.clicked.connect(self.animate) # 创建一个垂直布局,并将按钮添加到布局 layout = QVBoxLayout() layout.addWidget(self.button) self.setLayout(layout) # 设置控件的最小高度 self.setMinimumHeight(100) def animate(self): # 获取控件的当前高度 start_height = self.height() # 创建一个QPropertyAnimation对象,设置动画的目标和持续时间 animation = QPropertyAnimation(self, b'geometry', self) animation.setDuration(500) # 设置动画的起始值和结束值 start_geometry = QRect(0, 0, self.width(), start_height) end_geometry = QRect(0, 0, self.width(), 0) animation.setStartValue(start_geometry) animation.setEndValue(end_geometry) # 启动动画 animation.start() app = QApplication([]) widget = Widget() widget.show() app.exec_() ``` 希望这个答案能够帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值