Как кастомизировать QSlider определенным образом?
Главный контейнер моего приложения self.box содержит в себе 4 виджета:
- Кнопка
play_btn, которая начинает воспроизведение mp3-файла из словаряself.dict; - Кнопка
pause_btn, которая останавливает воспроизведение mp3-файла; - Надпись
label, которая показывает название воспроизводимого mp3-файла; - Слайдер
self.qsl, который контролирует момент воспроизведения mp3-файла.
Визуальные характеристики self.qsl мне нужно изменить следующим образом:
Высота полосы слайдера равна
7px.Часть слайдера, которая обозначает уже воспроизведенную часть файла (на рисунке обозначена цифрой 3) имеет цвет, отличающийся от цвета части слайдера, которая обозначает еще не воспроизведенную часть файла (на рисунке обозначена цифрой 2). Обе эти части имеют закругленные углы.
Ползунок слайдера (на рисунке обозначен цифрой 1) имеет форму круга диаметром 14px. Хотелось бы иметь возможность настроить его цвет.
Ползунок слайдера (на рисунке обозначен цифрой 1) имеет обводку. Хотелось бы иметь возможность настроить щирину и цвет этой обводки.
Ползунок слайдера (на рисунке обозначен цифрой 1) может просто представлять из себя картинку с вышеописанными характеристиками:

Пожалуйста, скажите, как это сделать?
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.dict = {
'C:/Users/User/Desktop/Player/music/13.Numb.mp3': []
}
self.song = ''
self.player = QtMultimedia.QMediaPlayer()
self.player.stateChanged.connect(self.playerState)
self.qsl = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
self.qsl.sliderMoved[int].connect(self.SetPlayPosition)
self.qsl.sliderReleased.connect(self.slider_released)
self.box = QtWidgets.QGridLayout(self)
for line, song in enumerate(self.dict):
play_btn = QtWidgets.QPushButton('Play', clicked=lambda ch, song=song: self.play(song))
pause_btn = QtWidgets.QPushButton('Pause', clicked=self.pause, enabled=False)
label = QtWidgets.QLabel(song)
self.box.addWidget(play_btn, line, 0)
self.box.addWidget(pause_btn, line, 1)
self.box.addWidget(label, line, 2)
self.dict[song].append(play_btn)
self.dict[song].append(pause_btn)
self.box.addWidget(self.qsl, 2, 0, 1, 3)
self.Play_Pause = True
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.PlayMode)
self.timer.start(1000)
def PlayMode(self):
if self.Play_Pause==False:
self.qsl.setMinimum(0)
self.qsl.setMaximum(self.player.duration())
self.qsl.setValue(self.qsl.value() + 1000)
def slider_released(self):
self.player.setPosition(self.qsl.value())
def SetPlayPosition(self, val):
pass
def play(self, song):
if self.player.isAudioAvailable() == False:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.dict[song][1].setEnabled(True)
self.song = song
if self.song == song:
pass
else:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.dict[self.song][1].setEnabled(False)
self.dict[song][1].setEnabled(True)
self.song = song
self.player.play()
self.Play_Pause=False
def pause(self):
self.player.pause()
self.Play_Pause=True
def playerState(self, state):
if state == 0:
self.Play_Pause=True
self.qsl.setSliderPosition(0)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.setWindowTitle('MP3-player, PyQt5')
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Это может выглядеть примерно так:
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.dict = {
'D:/_Qt/EXE/Mp3/new_build/QThread_mp3/img/zvuki_prirody.mp3': []
}
self.song = ''
self.player = QtMultimedia.QMediaPlayer()
self.player.stateChanged.connect(self.playerState)
self.qsl = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
self.qsl.setMinimumHeight(30) # +++
self.qsl.sliderMoved[int].connect(self.SetPlayPosition)
self.qsl.sliderReleased.connect(self.slider_released)
self.box = QtWidgets.QGridLayout(self)
for line, song in enumerate(self.dict):
play_btn = QtWidgets.QPushButton('Play', clicked=lambda ch, song=song: self.play(song))
pause_btn = QtWidgets.QPushButton('Pause', clicked=self.pause, enabled=False)
label = QtWidgets.QLabel(song)
self.box.addWidget(play_btn, line, 0)
self.box.addWidget(pause_btn, line, 1)
self.box.addWidget(label, line, 2)
self.dict[song].append(play_btn)
self.dict[song].append(pause_btn)
self.box.addWidget(self.qsl, 2, 0, 1, 3)
self.Play_Pause = True
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.PlayMode)
self.timer.start(1000)
def PlayMode(self):
if self.Play_Pause==False:
self.qsl.setMinimum(0)
self.qsl.setMaximum(self.player.duration())
self.qsl.setValue(self.qsl.value() + 1000)
def slider_released(self):
self.player.setPosition(self.qsl.value())
def SetPlayPosition(self, val):
pass
def play(self, song):
if self.player.isAudioAvailable() == False:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.dict[song][1].setEnabled(True)
self.song = song
if self.song == song:
pass
else:
self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
self.dict[self.song][1].setEnabled(False)
self.dict[song][1].setEnabled(True)
self.song = song
self.player.play()
self.Play_Pause=False
def pause(self):
self.player.pause()
self.Play_Pause=True
def playerState(self, state):
if state == 0:
self.Play_Pause=True
self.qsl.setSliderPosition(0)
QSS = """
QSlider::groove:horizontal {
border-radius: 1px;
height: 7px;
margin: -1px 0;
}
QSlider::handle:horizontal {
background-color: rgb(85, 17, 255);
border: 2px solid #ff0000;
height: 14px;
width: 12px;
margin: -4px 0;
border-radius: 7px ;
padding: -4px 0px;
}
QSlider::add-page:horizontal {
background: #1abc9c;
}
QSlider::sub-page:horizontal {
background: darkgray;
}
"""
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setStyleSheet(QSS)
window = MyWindow()
window.setWindowTitle('MP3-player, PyQt5')
window.show()
sys.exit(app.exec_())

