12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- #include "moc_absolute-slider.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;
- }
|