clickable_slider.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. from PyQt5 import QtCore, QtWidgets
  2. from PyQt5.QtCore import pyqtSignal
  3. class ClickableSlider(QtWidgets.QSlider):
  4. positionClicked = pyqtSignal(int)
  5. def mousePressEvent(self, event):
  6. super(ClickableSlider, self).mousePressEvent(event)
  7. if event.button() == QtCore.Qt.LeftButton:
  8. pos = self.pixelPosToRangeValue(event.pos())
  9. self.setValue(pos)
  10. self.sliderMoved.emit(pos)
  11. def pixelPosToRangeValue(self, pos):
  12. opt = QtWidgets.QStyleOptionSlider()
  13. self.initStyleOption(opt)
  14. gr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderGroove, self)
  15. sr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderHandle, self)
  16. if self.orientation() == QtCore.Qt.Horizontal:
  17. sliderLength = sr.width()
  18. sliderMin = gr.x()
  19. sliderMax = gr.right() - sliderLength + 1
  20. else:
  21. sliderLength = sr.height()
  22. sliderMin = gr.y()
  23. sliderMax = gr.bottom() - sliderLength + 1;
  24. pr = pos - sr.center() + sr.topLeft()
  25. p = pr.x() if self.orientation() == QtCore.Qt.Horizontal else pr.y()
  26. return QtWidgets.QStyle.sliderValueFromPosition(
  27. self.minimum(),
  28. self.maximum(),
  29. p - sliderMin,
  30. sliderMax - sliderMin,
  31. opt.upsideDown
  32. )