🐟🐟🐟 通过自定义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])# 传递demoSignaldef emitDemoSignal(self):self.demoSignal.emit(self.fake.name())# 更新字幕内容def changeDemoText(self, word):self.demo.pop(0)self.demo.append(word)self.update()
效果展示

完整代码
import sysfrom PySide2.QtCore import QRect, Qt, Signal, QTimerfrom PySide2.QtGui import QPainter, QBrush, QColor, QFontfrom PySide2.QtWidgets import *from faker import Fakerclass 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])# 触发demoSignaldef 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_()
