A QSlider with two handles. More...
#include <qxtspanslider.h>
Public Types | |
enum | HandleMovementMode { FreeMovement, NoCrossing, NoOverlapping } |
Public Slots | |
void | setLowerValue (int lower) |
void | setUpperValue (int upper) |
void | setSpan (int lower, int upper) |
void | setLowerPosition (int lower) |
void | setUpperPosition (int upper) |
Signals | |
void | spanChanged (int lower, int upper) |
void | lowerValueChanged (int lower) |
void | upperValueChanged (int upper) |
void | lowerPositionChanged (int lower) |
void | upperPositionChanged (int upper) |
Public Member Functions | |
QxtSpanSlider (QWidget *parent=0) | |
QxtSpanSlider (Qt::Orientation orientation, QWidget *parent=0) | |
virtual | ~QxtSpanSlider () |
HandleMovementMode | handleMovementMode () const |
void | setHandleMovementMode (HandleMovementMode mode) |
int | lowerValue () const |
int | upperValue () const |
int | lowerPosition () const |
int | upperPosition () const |
Protected Member Functions | |
virtual void | keyPressEvent (QKeyEvent *event) |
virtual void | mousePressEvent (QMouseEvent *event) |
virtual void | mouseMoveEvent (QMouseEvent *event) |
virtual void | mouseReleaseEvent (QMouseEvent *event) |
virtual void | paintEvent (QPaintEvent *event) |
Properties | |
int | lowerValue |
This property holds the lower value of the span. | |
int | upperValue |
This property holds the upper value of the span. | |
int | lowerPosition |
This property holds the lower position of the span. | |
int | upperPosition |
This property holds the upper position of the span. | |
HandleMovementMode | handleMovementMode |
This property holds the handle movement mode. | |
Friends | |
class | QxtSpanSliderPrivate |
A QSlider with two handles.
QxtSpanSlider is a slider with two handles. QxtSpanSlider is handy for letting user to choose an span between min/max.
The span color is calculated based on QPalette::Highlight.
The keys are bound according to the following table:
Orientation | Key | Handle |
Qt::Horizontal | Qt::Key_Left | lower |
Qt::Horizontal | Qt::Key_Right | lower |
Qt::Horizontal | Qt::Key_Up | upper |
Qt::Horizontal | Qt::Key_Down | upper |
Qt::Vertical | Qt::Key_Up | lower |
Qt::Vertical | Qt::Key_Down | lower |
Qt::Vertical | Qt::Key_Left | upper |
Qt::Vertical | Qt::Key_Right | upper |
Keys are bound by the time the slider is created. A key is bound to same handle for the lifetime of the slider. So even if the handle representation might change from lower to upper, the same key binding remains.
QxtSpanSlider in Plastique style.
Definition at line 35 of file qxtspanslider.h.
This enum describes the available handle movement modes.
Definition at line 51 of file qxtspanslider.h.
{ FreeMovement, NoCrossing, NoOverlapping };
QxtSpanSlider::QxtSpanSlider | ( | QWidget * | parent = 0 ) |
[explicit] |
Constructs a new QxtSpanSlider with parent.
Definition at line 419 of file qxtspanslider.cpp.
References QXT_INIT_PRIVATE.
: QSlider(parent) { QXT_INIT_PRIVATE(QxtSpanSlider); connect(this, SIGNAL(rangeChanged(int, int)), &qxt_d(), SLOT(updateRange(int, int))); connect(this, SIGNAL(sliderReleased()), &qxt_d(), SLOT(movePressedHandle())); }
QxtSpanSlider::QxtSpanSlider | ( | Qt::Orientation | orientation, |
QWidget * | parent = 0 |
||
) | [explicit] |
Constructs a new QxtSpanSlider with orientation and parent.
Definition at line 429 of file qxtspanslider.cpp.
References QXT_INIT_PRIVATE.
: QSlider(orientation, parent) { QXT_INIT_PRIVATE(QxtSpanSlider); connect(this, SIGNAL(rangeChanged(int, int)), &qxt_d(), SLOT(updateRange(int, int))); connect(this, SIGNAL(sliderReleased()), &qxt_d(), SLOT(movePressedHandle())); }
QxtSpanSlider::~QxtSpanSlider | ( | ) | [virtual] |
HandleMovementMode QxtSpanSlider::handleMovementMode | ( | ) | const |
void QxtSpanSlider::keyPressEvent | ( | QKeyEvent * | event ) | [protected, virtual] |
Definition at line 567 of file qxtspanslider.cpp.
References mitk::Key_Down, mitk::Key_End, mitk::Key_Home, mitk::Key_Left, mitk::Key_Right, mitk::Key_Up, QxtSpanSliderPrivate::LowerHandle, main(), and QxtSpanSliderPrivate::UpperHandle.
{ QSlider::keyPressEvent(event); bool main = true; SliderAction action = SliderNoAction; switch (event->key()) { case Qt::Key_Left: main = (orientation() == Qt::Horizontal); action = !invertedAppearance() ? SliderSingleStepSub : SliderSingleStepAdd; break; case Qt::Key_Right: main = (orientation() == Qt::Horizontal); action = !invertedAppearance() ? SliderSingleStepAdd : SliderSingleStepSub; break; case Qt::Key_Up: main = (orientation() == Qt::Vertical); action = invertedControls() ? SliderSingleStepSub : SliderSingleStepAdd; break; case Qt::Key_Down: main = (orientation() == Qt::Vertical); action = invertedControls() ? SliderSingleStepAdd : SliderSingleStepSub; break; case Qt::Key_Home: main = (qxt_d().mainControl == QxtSpanSliderPrivate::LowerHandle); action = SliderToMinimum; break; case Qt::Key_End: main = (qxt_d().mainControl == QxtSpanSliderPrivate::UpperHandle); action = SliderToMaximum; break; default: event->ignore(); break; } if (action) qxt_d().triggerAction(action, main); }
int QxtSpanSlider::lowerPosition | ( | ) | const |
QxtSpanSlider::lowerPositionChanged | ( | int | lower ) | [signal] |
This signal is emitted whenever the lower position has changed.
Referenced by setLowerPosition().
int QxtSpanSlider::lowerValue | ( | ) | const |
Referenced by mouseMoveEvent().
QxtSpanSlider::lowerValueChanged | ( | int | lower ) | [signal] |
This signal is emitted whenever the lower value has changed.
Referenced by setSpan().
void QxtSpanSlider::mouseMoveEvent | ( | QMouseEvent * | event ) | [protected, virtual] |
Definition at line 630 of file qxtspanslider.cpp.
References FreeMovement, lowerValue(), NoCrossing, NoOverlapping, setLowerPosition(), setUpperPosition(), and upperValue().
{ if (qxt_d().lowerPressed != QStyle::SC_SliderHandle && qxt_d().upperPressed != QStyle::SC_SliderHandle) { event->ignore(); return; } QStyleOptionSlider opt; qxt_d().initStyleOption(&opt); const int m = style()->pixelMetric(QStyle::PM_MaximumDragDistance, &opt, this); int newPosition = qxt_d().pixelPosToRangeValue(qxt_d().pick(event->pos()) - qxt_d().offset); if (m >= 0) { const QRect r = rect().adjusted(-m, -m, m, m); if (!r.contains(event->pos())) { newPosition = qxt_d().position; } } // pick the preferred handle on the first movement if (qxt_d().firstMovement) { if (qxt_d().lower == qxt_d().upper) { if (newPosition < lowerValue()) { qxt_d().swapControls(); qxt_d().firstMovement = false; } } else { qxt_d().firstMovement = false; } } if (qxt_d().lowerPressed == QStyle::SC_SliderHandle) { if (qxt_d().movement == NoCrossing) newPosition = qMin(newPosition, upperValue()); else if (qxt_d().movement == NoOverlapping) newPosition = qMin(newPosition, upperValue() - 1); if (qxt_d().movement == FreeMovement && newPosition > qxt_d().upper) { qxt_d().swapControls(); setUpperPosition(newPosition); } else { setLowerPosition(newPosition); } } else if (qxt_d().upperPressed == QStyle::SC_SliderHandle) { if (qxt_d().movement == NoCrossing) newPosition = qMax(newPosition, lowerValue()); else if (qxt_d().movement == NoOverlapping) newPosition = qMax(newPosition, lowerValue() + 1); if (qxt_d().movement == FreeMovement && newPosition < qxt_d().lower) { qxt_d().swapControls(); setLowerPosition(newPosition); } else { setUpperPosition(newPosition); } } event->accept(); }
void QxtSpanSlider::mousePressEvent | ( | QMouseEvent * | event ) | [protected, virtual] |
Definition at line 611 of file qxtspanslider.cpp.
References QxtSpanSliderPrivate::LowerHandle, and QxtSpanSliderPrivate::UpperHandle.
{ if (minimum() == maximum() || (event->buttons() ^ event->button())) { event->ignore(); return; } qxt_d().handleMousePress(event->pos(), qxt_d().upperPressed, qxt_d().upper, QxtSpanSliderPrivate::UpperHandle); if (qxt_d().upperPressed != QStyle::SC_SliderHandle) qxt_d().handleMousePress(event->pos(), qxt_d().lowerPressed, qxt_d().lower, QxtSpanSliderPrivate::LowerHandle); qxt_d().firstMovement = true; event->accept(); }
void QxtSpanSlider::mouseReleaseEvent | ( | QMouseEvent * | event ) | [protected, virtual] |
Definition at line 708 of file qxtspanslider.cpp.
{ QSlider::mouseReleaseEvent(event); setSliderDown(false); qxt_d().lowerPressed = QStyle::SC_None; qxt_d().upperPressed = QStyle::SC_None; update(); }
void QxtSpanSlider::paintEvent | ( | QPaintEvent * | event ) | [protected, virtual] |
Definition at line 720 of file qxtspanslider.cpp.
References QxtSpanSliderPrivate::LowerHandle, and QxtSpanSliderPrivate::UpperHandle.
{ Q_UNUSED(event); QStylePainter painter(this); // ticks QStyleOptionSlider opt; qxt_d().initStyleOption(&opt); opt.subControls = QStyle::SC_SliderTickmarks; painter.drawComplexControl(QStyle::CC_Slider, opt); // groove opt.sliderValue = 0; opt.sliderPosition = 0; opt.subControls = QStyle::SC_SliderGroove; painter.drawComplexControl(QStyle::CC_Slider, opt); // handle rects opt.sliderPosition = qxt_d().lowerPos; const QRect lr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); const int lrv = qxt_d().pick(lr.center()); opt.sliderPosition = qxt_d().upperPos; const QRect ur = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); const int urv = qxt_d().pick(ur.center()); // span const int minv = qMin(lrv, urv); const int maxv = qMax(lrv, urv); const QPoint c = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, this).center(); QRect spanRect; if (orientation() == Qt::Horizontal) spanRect = QRect(QPoint(minv, c.y() - 2), QPoint(maxv, c.y() + 1)); else spanRect = QRect(QPoint(c.x() - 2, minv), QPoint(c.x() + 1, maxv)); qxt_d().drawSpan(&painter, spanRect); // handles switch (qxt_d().lastPressed) { case QxtSpanSliderPrivate::LowerHandle: qxt_d().drawHandle(&painter, QxtSpanSliderPrivate::UpperHandle); qxt_d().drawHandle(&painter, QxtSpanSliderPrivate::LowerHandle); break; case QxtSpanSliderPrivate::UpperHandle: default: qxt_d().drawHandle(&painter, QxtSpanSliderPrivate::LowerHandle); qxt_d().drawHandle(&painter, QxtSpanSliderPrivate::UpperHandle); break; } }
void QxtSpanSlider::setHandleMovementMode | ( | QxtSpanSlider::HandleMovementMode | mode ) |
Definition at line 452 of file qxtspanslider.cpp.
Referenced by QmitkTransferFunctionWidget::QmitkTransferFunctionWidget().
{ qxt_d().movement = mode; }
void QxtSpanSlider::setLowerPosition | ( | int | lower ) | [slot] |
Definition at line 521 of file qxtspanslider.cpp.
References QxtSpanSliderPrivate::LowerHandle, lowerPositionChanged(), and main().
Referenced by mouseMoveEvent(), and QxtSpanSliderPrivate::triggerAction().
{ if (qxt_d().lowerPos != lower) { qxt_d().lowerPos = lower; if (!hasTracking()) update(); if (isSliderDown()) emit lowerPositionChanged(lower); if (hasTracking() && !qxt_d().blockTracking) { bool main = (qxt_d().mainControl == QxtSpanSliderPrivate::LowerHandle); qxt_d().triggerAction(SliderMove, main); } } }
void QxtSpanSlider::setLowerValue | ( | int | lower ) | [slot] |
Definition at line 466 of file qxtspanslider.cpp.
References setSpan().
Referenced by QmitkBinaryThresholdULToolGUI::OnLowerSpinnerChanged(), QmitkTransferFunctionWidget::OnResetSlider(), and QxtSpanSliderPrivate::triggerAction().
{ setSpan(lower, qxt_d().upper); }
void QxtSpanSlider::setSpan | ( | int | lower, |
int | upper | ||
) | [slot] |
Sets the span from lower to upper.
Definition at line 489 of file qxtspanslider.cpp.
References lowerValueChanged(), spanChanged(), and upperValueChanged().
Referenced by QmitkBinaryThresholdULToolGUI::OnThresholdingValuesChanged(), QmitkTransferFunctionWidget::SetDataNode(), setLowerValue(), setUpperValue(), and QxtSpanSliderPrivate::updateRange().
{ const int low = qBound(minimum(), qMin(lower, upper), maximum()); const int upp = qBound(minimum(), qMax(lower, upper), maximum()); if (low != qxt_d().lower || upp != qxt_d().upper) { if (low != qxt_d().lower) { qxt_d().lower = low; qxt_d().lowerPos = low; emit lowerValueChanged(low); } if (upp != qxt_d().upper) { qxt_d().upper = upp; qxt_d().upperPos = upp; emit upperValueChanged(upp); } emit spanChanged(qxt_d().lower, qxt_d().upper); update(); } }
void QxtSpanSlider::setUpperPosition | ( | int | upper ) | [slot] |
Definition at line 547 of file qxtspanslider.cpp.
References main(), QxtSpanSliderPrivate::UpperHandle, and upperPositionChanged().
Referenced by mouseMoveEvent(), and QxtSpanSliderPrivate::triggerAction().
{ if (qxt_d().upperPos != upper) { qxt_d().upperPos = upper; if (!hasTracking()) update(); if (isSliderDown()) emit upperPositionChanged(upper); if (hasTracking() && !qxt_d().blockTracking) { bool main = (qxt_d().mainControl == QxtSpanSliderPrivate::UpperHandle); qxt_d().triggerAction(SliderMove, main); } } }
void QxtSpanSlider::setUpperValue | ( | int | upper ) | [slot] |
Definition at line 480 of file qxtspanslider.cpp.
References setSpan().
Referenced by QmitkTransferFunctionWidget::OnResetSlider(), QmitkBinaryThresholdULToolGUI::OnUpperSpinnerChanged(), and QxtSpanSliderPrivate::triggerAction().
{ setSpan(qxt_d().lower, upper); }
QxtSpanSlider::spanChanged | ( | int | lower, |
int | upper | ||
) | [signal] |
This signal is emitted whenever the span has changed.
Referenced by setSpan().
int QxtSpanSlider::upperPosition | ( | ) | const |
QxtSpanSlider::upperPositionChanged | ( | int | upper ) | [signal] |
This signal is emitted whenever the upper position has changed.
Referenced by setUpperPosition().
int QxtSpanSlider::upperValue | ( | ) | const |
Referenced by mouseMoveEvent().
QxtSpanSlider::upperValueChanged | ( | int | upper ) | [signal] |
This signal is emitted whenever the upper value has changed.
Referenced by setSpan().
friend class QxtSpanSliderPrivate [friend] |
Definition at line 38 of file qxtspanslider.h.
QxtSpanSlider::HandleMovementMode QxtSpanSlider::handleMovementMode [read, write] |
This property holds the handle movement mode.
Definition at line 43 of file qxtspanslider.h.
int QxtSpanSlider::lowerPosition [read, write] |
This property holds the lower position of the span.
Definition at line 41 of file qxtspanslider.h.
int QxtSpanSlider::lowerValue [read, write] |
This property holds the lower value of the span.
Definition at line 38 of file qxtspanslider.h.
Referenced by QmitkTransferFunctionWidget::UpdateRanges().
int QxtSpanSlider::upperPosition [read, write] |
This property holds the upper position of the span.
Definition at line 42 of file qxtspanslider.h.
int QxtSpanSlider::upperValue [read, write] |
This property holds the upper value of the span.
Definition at line 40 of file qxtspanslider.h.
Referenced by QmitkTransferFunctionWidget::UpdateRanges().