| 12345678910111213141516171819202122232425262728293031323334353637 |
- 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
- )
|