absolute-slider.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "absolute-slider.hpp"
  2. AbsoluteSlider::AbsoluteSlider(QWidget *parent) : SliderIgnoreScroll(parent)
  3. {
  4. installEventFilter(this);
  5. setMouseTracking(true);
  6. }
  7. AbsoluteSlider::AbsoluteSlider(Qt::Orientation orientation, QWidget *parent)
  8. : SliderIgnoreScroll(orientation, parent)
  9. {
  10. installEventFilter(this);
  11. setMouseTracking(true);
  12. }
  13. void AbsoluteSlider::mousePressEvent(QMouseEvent *event)
  14. {
  15. dragging = (event->buttons() & Qt::LeftButton ||
  16. event->buttons() & Qt::MiddleButton);
  17. if (dragging) {
  18. setSliderDown(true);
  19. setValue(posToRangeValue(event));
  20. emit AbsoluteSlider::sliderMoved(posToRangeValue(event));
  21. }
  22. event->accept();
  23. }
  24. void AbsoluteSlider::mouseReleaseEvent(QMouseEvent *event)
  25. {
  26. dragging = false;
  27. setSliderDown(false);
  28. event->accept();
  29. }
  30. void AbsoluteSlider::mouseMoveEvent(QMouseEvent *event)
  31. {
  32. int val = posToRangeValue(event);
  33. if (val > maximum())
  34. val = maximum();
  35. else if (val < minimum())
  36. val = minimum();
  37. emit absoluteSliderHovered(val);
  38. if (dragging) {
  39. setValue(posToRangeValue(event));
  40. emit AbsoluteSlider::sliderMoved(posToRangeValue(event));
  41. }
  42. QSlider::mouseMoveEvent(event);
  43. event->accept();
  44. }
  45. bool AbsoluteSlider::eventFilter(QObject *obj, QEvent *event)
  46. {
  47. if (event->type() == QEvent::KeyPress) {
  48. QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
  49. if (keyEvent->key() == Qt::Key_Up ||
  50. keyEvent->key() == Qt::Key_Down) {
  51. return true;
  52. }
  53. }
  54. return QSlider::eventFilter(obj, event);
  55. }
  56. int AbsoluteSlider::posToRangeValue(QMouseEvent *event)
  57. {
  58. QStyleOptionSlider opt;
  59. initStyleOption(&opt);
  60. int pos;
  61. int sliderMin;
  62. int sliderMax;
  63. int handleLength;
  64. const QRect groove = style()->subControlRect(
  65. QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this);
  66. const QRect handle = style()->subControlRect(
  67. QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
  68. if (orientation() == Qt::Horizontal) {
  69. pos = event->pos().x();
  70. handleLength = handle.width();
  71. sliderMin = groove.left() + (handleLength / 2);
  72. sliderMax = groove.right() - (handleLength / 2) + 1;
  73. } else {
  74. pos = event->pos().y();
  75. handleLength = handle.height();
  76. sliderMin = groove.top() + (handleLength / 2);
  77. sliderMax = groove.bottom() - (handleLength / 2) + 1;
  78. }
  79. int sliderValue = style()->sliderValueFromPosition(
  80. minimum(), maximum(), pos - sliderMin, sliderMax - sliderMin,
  81. opt.upsideDown);
  82. return sliderValue;
  83. }