AbsoluteSlider.cpp 2.4 KB

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