absolute-slider.cpp 2.3 KB

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