🐟🐟🐟 通过自定义Label控件实现字幕滚动功能

实现方法

  • 在Label上绘制字幕区域

要想在Label控件上实现字幕功能,可以通过使用QT的QPainter,以及重写Label中的paintEvent(只要窗口部件需要被重绘就被调用。每个要显示输出的窗口部件必须实现它。事件来进行字幕区域的绘制,后续的字幕内容绘制也放置在paintEvent事件中进行绘制。

  1. def paintEvent(self, event):
  2. super().paintEvent(event)
  3. # 基础框架绘制
  4. painter = QPainter(self)
  5. painter.setPen(Qt.NoPen) # 设置画笔
  6. rect = QRect(750, 70, 200, 140) # 设置矩形的位置和大小(x,y,wight,height)
  7. brush = QBrush(QColor(0, 0, 0, 70), Qt.SolidPattern) # 设置画刷属性
  8. painter.setBrush(brush)
  9. painter.drawRect(rect)
  • 字幕的更新

想要实现字幕的更新,可以调用update()方法来对painterEvent事件中绘制的内容进行更新,以此来达成字幕的更新效果。此demo将通过Signal以及Qtimer来模拟实现字幕的更新滚动。在具体的使用场景中可以直接通过信号传输来进行效果的实现

  1. class DemoLabel(QLabel):
  2. demoSignal = Signal(str)
  3. def __init__(self, parent=None):
  4. super(DemoLabel, self).__init__(parent)
  5. self.ylst = [100, 130, 160] # 字幕y轴坐标
  6. self.demo = ["hello", "world", "demo"] # 模拟字幕内容
  7. self.fake = Faker() # 模拟要更新的字幕数据
  8. self.timer = QTimer() # 创建定时器
  9. self.timer.timeout.connect(self.emitDemoSignal)
  10. self.demoSignal.connect(self.changeDemoText)
  11. self.timer.start(1000)
  12. def paintEvent(self, event):
  13. super().paintEvent(event)
  14. # 基础框架绘制
  15. painter = QPainter(self)
  16. painter.setPen(Qt.NoPen)
  17. rect = QRect(750, 70, 270, 140)
  18. brush = QBrush(QColor(0, 0, 0, 70), Qt.SolidPattern)
  19. painter.setBrush(brush)
  20. painter.drawRect(rect)
  21. # 字幕内容绘制
  22. painter.setPen(Qt.white)
  23. painter.setFont(QFont("SimSun", 14, QFont.Bold))
  24. painter.drawText(770, self.ylst[0], self.demo[0])
  25. painter.drawText(770, self.ylst[1], self.demo[1])
  26. painter.drawText(770, self.ylst[2], self.demo[2])
  27. # 传递demoSignal
  28. def emitDemoSignal(self):
  29. self.demoSignal.emit(self.fake.name())
  30. # 更新字幕内容
  31. def changeDemoText(self, word):
  32. self.demo.pop(0)
  33. self.demo.append(word)
  34. self.update()

效果展示

🍙 QLabel 实现字幕滚动功能 - 图1

完整代码

  1. import sys
  2. from PySide2.QtCore import QRect, Qt, Signal, QTimer
  3. from PySide2.QtGui import QPainter, QBrush, QColor, QFont
  4. from PySide2.QtWidgets import *
  5. from faker import Faker
  6. class DemoLabel(QLabel):
  7. demoSignal = Signal(str)
  8. def __init__(self, parent=None):
  9. super(DemoLabel, self).__init__(parent)
  10. self.ylst = [100, 130, 160] # 字幕y轴坐标
  11. self.demo = ["hello", "world", "demo"] # 模拟字幕内容
  12. self.fake = Faker() # 模拟要更新的字幕数据
  13. self.timer = QTimer() # 创建定时器
  14. self.timer.timeout.connect(self.emitDemoSignal)
  15. self.demoSignal.connect(self.changeDemoText)
  16. self.timer.start(1000)
  17. def paintEvent(self, event):
  18. super().paintEvent(event)
  19. # 基础框架绘制
  20. painter = QPainter(self)
  21. painter.setPen(Qt.NoPen)
  22. rect = QRect(750, 70, 270, 140)
  23. brush = QBrush(QColor(0, 0, 0, 70), Qt.SolidPattern)
  24. painter.setBrush(brush)
  25. painter.drawRect(rect)
  26. # 字幕内容绘制
  27. painter.setPen(Qt.white)
  28. painter.setFont(QFont("SimSun", 14, QFont.Bold))
  29. painter.drawText(770, self.ylst[0], self.demo[0])
  30. painter.drawText(770, self.ylst[1], self.demo[1])
  31. painter.drawText(770, self.ylst[2], self.demo[2])
  32. # 触发demoSignal
  33. def emitDemoSignal(self):
  34. self.demoSignal.emit(self.fake.name())
  35. # 更新字幕内容
  36. def changeDemoText(self, word):
  37. self.demo.pop(0)
  38. self.demo.append(word)
  39. self.update()
  40. class Example(QWidget):
  41. def __init__(self):
  42. super(Example, self).__init__()
  43. self.initUI()
  44. def initUI(self):
  45. self.lo = QVBoxLayout()
  46. self.label = DemoLabel()
  47. self.label.setPixmap("xxxx.jpg")
  48. self.lo.addWidget(self.label)
  49. self.setLayout(self.lo)
  50. self.setWindowTitle('demo')
  51. if __name__ == '__main__':
  52. app = QApplication(sys.argv)
  53. ex = Example()
  54. ex.show()
  55. app.exec_()