qt实现音乐播放器歌词
时间: 2023-12-27 21:04:01 浏览: 153
在Qt中实现音乐播放器歌词可以通过以下步骤实现:
1. 创建一个QLabel用于显示当前播放的歌词,设置其字体、颜色、对齐方式等属性。
2. 创建一个QListWidget用于显示所有的歌词,将其隐藏。
3. 读取歌词文件,将歌词按照时间轴进行排序,存储到一个QMap中,其中key为歌词出现的时间,value为歌词内容。
4. 在音乐播放器中添加一个QTimer,每隔一段时间获取当前播放时间,从QMap中查找对应的歌词,将其显示在QLabel中。
5. 根据当前播放时间,将QListWidget中对应的歌词项高亮显示,同时将其前面和后面的歌词发送给其他对应的QLabel,实现动态效果。
以下是一个简单的示例代码:
```python
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QFont, QColor
from PyQt5.QtWidgets import QWidget, QLabel, QListWidget, QListWidgetItem, QHBoxLayout, QVBoxLayout
class MusicPlayer(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建QLabel用于显示当前播放的歌词
self.lyric_label = QLabel(self)
self.lyric_label.setAlignment(Qt.AlignCenter)
self.lyric_label.setFont(QFont('Arial', 20))
self.lyric_label.setStyleSheet('color: white')
# 创建QListWidget用于显示所有的歌词
self.lyric_list = QListWidget(self)
self.lyric_list.hide()
# 将QLabel和QListWidget添加到水平布局中
hbox = QHBoxLayout()
hbox.addWidget(self.lyric_label)
hbox.addWidget(self.lyric_list)
# 创建垂直布局并将水平布局添加到其中
vbox = QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)
vbox.addStretch(1)
self.setLayout(vbox)
# 读取歌词文件并将歌词按照时间轴进行排序
self.lyric_map = {}
with open('lyric.txt', 'r', encoding='utf-8') as f:
for line in f.readlines():
if line.strip() == '':
continue
time_str, lyric = line.strip().split(']')
time = self.time2ms(time_str[1:])
self.lyric_map[time] = lyric
# 创建QTimer用于更新歌词
self.timer = QTimer(self)
self.timer.timeout.connect(self.updateLyric)
def time2ms(self, time_str):
# 将时间字符串转换为毫秒数
minute, second = time_str.split(':')
return int(minute) * 60 * 1000 + int(second) * 1000
def updateLyric(self):
# 获取当前播放时间
current_time = self.player.getCurrentTime()
# 在QMap中查找对应的歌词
lyric = ''
for time in self.lyric_map.keys():
if current_time >= time:
lyric = self.lyric_map[time]
else:
break
# 将歌词显示在QLabel中
self.lyric_label.setText(lyric)
# 将QListWidget中对应的歌词项高亮显示
for i in range(self.lyric_list.count()):
item = self.lyric_list.item(i)
if item.data(Qt.UserRole) <= current_time:
item.setForeground(QColor(255, 255, 255))
item.setBackground(QColor(0, 0, 0))
else:
item.setForeground(QColor(128, 128, 128))
item.setBackground(QColor(255, 255, 255))
# 将当前歌词的前面和后面的歌词发送给其他对应的QLabel
for i in range(self.lyric_list.count()):
item = self.lyric_list.item(i)
if item.data(Qt.UserRole) == current_time:
self.lyric_label.setText(item.text())
if i > 0:
self.lyric_list.item(i - 1).setForeground(QColor(255, 255, 255))
self.lyric_list.item(i - 1).setBackground(QColor(0, 0, 0))
if i < self.lyric_list.count() - 1:
self.lyric_list.item(i + 1).setForeground(QColor(255, 255, 255))
self.lyric_list.item(i + 1).setBackground(QColor(0, 0, 0))
def loadLyric(self, lyric_file):
# 读取歌词文件并将歌词按照时间轴进行排序
self.lyric_map = {}
with open(lyric_file, 'r', encoding='utf-8') as f:
for line in f.readlines():
if line.strip() == '':
continue
time_str, lyric = line.strip().split(']')
time = self.time2ms(time_str[1:])
self.lyric_map[time] = lyric
# 将歌词添加到QListWidget中
self.lyric_list.clear()
for time, lyric in self.lyric_map.items():
item = QListWidgetItem(lyric)
item.setData(Qt.UserRole, time)
item.setForeground(QColor(128, 128, 128))
item.setBackground(QColor(255, 255, 255))
self.lyric_list.addItem(item)
def play(self):
# 开始播放音乐并启动QTimer
self.player.play()
self.timer.start(100)
def pause(self):
# 暂停播放音乐并停止QTimer
self.player.pause()
self.timer.stop()
# 相关问题:
--相关问题--:
阅读全文