🐟🐟🐟 通过自定义Label控件实现字幕滚动功能
实现方法
- 在Label上绘制字幕区域
要想在Label控件上实现字幕功能,可以通过使用QT的QPainter,以及重写Label中的paintEvent(只要窗口部件需要被重绘就被调用。每个要显示输出的窗口部件必须实现它。)事件来进行字幕区域的绘制,后续的字幕内容绘制也放置在paintEvent事件中进行绘制。
def paintEvent(self, event):
super().paintEvent(event)
# 基础框架绘制
painter = QPainter(self)
painter.setPen(Qt.NoPen) # 设置画笔
rect = QRect(750, 70, 200, 140) # 设置矩形的位置和大小(x,y,wight,height)
brush = QBrush(QColor(0, 0, 0, 70), Qt.SolidPattern) # 设置画刷属性
painter.setBrush(brush)
painter.drawRect(rect)
- 字幕的更新
想要实现字幕的更新,可以调用update()方法来对painterEvent事件中绘制的内容进行更新,以此来达成字幕的更新效果。此demo将通过Signal以及Qtimer来模拟实现字幕的更新滚动。在具体的使用场景中可以直接通过信号传输来进行效果的实现
class DemoLabel(QLabel):
demoSignal = Signal(str)
def __init__(self, parent=None):
super(DemoLabel, self).__init__(parent)
self.ylst = [100, 130, 160] # 字幕y轴坐标
self.demo = ["hello", "world", "demo"] # 模拟字幕内容
self.fake = Faker() # 模拟要更新的字幕数据
self.timer = QTimer() # 创建定时器
self.timer.timeout.connect(self.emitDemoSignal)
self.demoSignal.connect(self.changeDemoText)
self.timer.start(1000)
def paintEvent(self, event):
super().paintEvent(event)
# 基础框架绘制
painter = QPainter(self)
painter.setPen(Qt.NoPen)
rect = QRect(750, 70, 270, 140)
brush = QBrush(QColor(0, 0, 0, 70), Qt.SolidPattern)
painter.setBrush(brush)
painter.drawRect(rect)
# 字幕内容绘制
painter.setPen(Qt.white)
painter.setFont(QFont("SimSun", 14, QFont.Bold))
painter.drawText(770, self.ylst[0], self.demo[0])
painter.drawText(770, self.ylst[1], self.demo[1])
painter.drawText(770, self.ylst[2], self.demo[2])
# 传递demoSignal
def emitDemoSignal(self):
self.demoSignal.emit(self.fake.name())
# 更新字幕内容
def changeDemoText(self, word):
self.demo.pop(0)
self.demo.append(word)
self.update()
效果展示
完整代码
import sys
from PySide2.QtCore import QRect, Qt, Signal, QTimer
from PySide2.QtGui import QPainter, QBrush, QColor, QFont
from PySide2.QtWidgets import *
from faker import Faker
class DemoLabel(QLabel):
demoSignal = Signal(str)
def __init__(self, parent=None):
super(DemoLabel, self).__init__(parent)
self.ylst = [100, 130, 160] # 字幕y轴坐标
self.demo = ["hello", "world", "demo"] # 模拟字幕内容
self.fake = Faker() # 模拟要更新的字幕数据
self.timer = QTimer() # 创建定时器
self.timer.timeout.connect(self.emitDemoSignal)
self.demoSignal.connect(self.changeDemoText)
self.timer.start(1000)
def paintEvent(self, event):
super().paintEvent(event)
# 基础框架绘制
painter = QPainter(self)
painter.setPen(Qt.NoPen)
rect = QRect(750, 70, 270, 140)
brush = QBrush(QColor(0, 0, 0, 70), Qt.SolidPattern)
painter.setBrush(brush)
painter.drawRect(rect)
# 字幕内容绘制
painter.setPen(Qt.white)
painter.setFont(QFont("SimSun", 14, QFont.Bold))
painter.drawText(770, self.ylst[0], self.demo[0])
painter.drawText(770, self.ylst[1], self.demo[1])
painter.drawText(770, self.ylst[2], self.demo[2])
# 触发demoSignal
def emitDemoSignal(self):
self.demoSignal.emit(self.fake.name())
# 更新字幕内容
def changeDemoText(self, word):
self.demo.pop(0)
self.demo.append(word)
self.update()
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.lo = QVBoxLayout()
self.label = DemoLabel()
self.label.setPixmap("xxxx.jpg")
self.lo.addWidget(self.label)
self.setLayout(self.lo)
self.setWindowTitle('demo')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
app.exec_()