from PyQt5 import QtCore, QtWidgets from PyQt5.QtCore import pyqtSignal class ClickableSlider(QtWidgets.QSlider): positionClicked = pyqtSignal(int) def mousePressEvent(self, event): super(ClickableSlider, self).mousePressEvent(event) if event.button() == QtCore.Qt.LeftButton: pos = self.pixelPosToRangeValue(event.pos()) self.setValue(pos) self.sliderMoved.emit(pos) def pixelPosToRangeValue(self, pos): opt = QtWidgets.QStyleOptionSlider() self.initStyleOption(opt) gr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderGroove, self) sr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderHandle, self) if self.orientation() == QtCore.Qt.Horizontal: sliderLength = sr.width() sliderMin = gr.x() sliderMax = gr.right() - sliderLength + 1 else: sliderLength = sr.height() sliderMin = gr.y() sliderMax = gr.bottom() - sliderLength + 1; pr = pos - sr.center() + sr.topLeft() p = pr.x() if self.orientation() == QtCore.Qt.Horizontal else pr.y() return QtWidgets.QStyle.sliderValueFromPosition( self.minimum(), self.maximum(), p - sliderMin, sliderMax - sliderMin, opt.upsideDown )