1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #include "AbsoluteSlider.hpp"
- #include "moc_AbsoluteSlider.cpp"
- AbsoluteSlider::AbsoluteSlider(QWidget *parent) : SliderIgnoreScroll(parent)
- {
- installEventFilter(this);
- setMouseTracking(true);
- }
- AbsoluteSlider::AbsoluteSlider(Qt::Orientation orientation, QWidget *parent) : SliderIgnoreScroll(orientation, parent)
- {
- installEventFilter(this);
- setMouseTracking(true);
- }
- void AbsoluteSlider::mousePressEvent(QMouseEvent *event)
- {
- dragging = (event->buttons() & Qt::LeftButton || event->buttons() & Qt::MiddleButton);
- if (dragging) {
- setSliderDown(true);
- setValue(posToRangeValue(event));
- emit AbsoluteSlider::sliderMoved(posToRangeValue(event));
- }
- event->accept();
- }
- void AbsoluteSlider::mouseReleaseEvent(QMouseEvent *event)
- {
- dragging = false;
- setSliderDown(false);
- event->accept();
- }
- void AbsoluteSlider::mouseMoveEvent(QMouseEvent *event)
- {
- int val = posToRangeValue(event);
- if (val > maximum())
- val = maximum();
- else if (val < minimum())
- val = minimum();
- emit absoluteSliderHovered(val);
- if (dragging) {
- setValue(posToRangeValue(event));
- emit AbsoluteSlider::sliderMoved(posToRangeValue(event));
- }
- QSlider::mouseMoveEvent(event);
- event->accept();
- }
- bool AbsoluteSlider::eventFilter(QObject *obj, QEvent *event)
- {
- if (event->type() == QEvent::KeyPress) {
- QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
- if (keyEvent->key() == Qt::Key_Up || keyEvent->key() == Qt::Key_Down) {
- return true;
- }
- }
- return QSlider::eventFilter(obj, event);
- }
- int AbsoluteSlider::posToRangeValue(QMouseEvent *event)
- {
- QStyleOptionSlider opt;
- initStyleOption(&opt);
- int pos;
- int sliderMin;
- int sliderMax;
- int handleLength;
- const QRect groove = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this);
- const QRect handle = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
- if (orientation() == Qt::Horizontal) {
- pos = event->pos().x();
- handleLength = handle.width();
- sliderMin = groove.left() + (handleLength / 2);
- sliderMax = groove.right() - (handleLength / 2) + 1;
- } else {
- pos = event->pos().y();
- handleLength = handle.height();
- sliderMin = groove.top() + (handleLength / 2);
- sliderMax = groove.bottom() - (handleLength / 2) + 1;
- }
- int sliderValue = style()->sliderValueFromPosition(minimum(), maximum(), pos - sliderMin, sliderMax - sliderMin,
- opt.upsideDown);
- return sliderValue;
- }
|