Public Types | Public Slots | Signals | Public Member Functions | Protected Member Functions | Properties | Friends

QxtSpanSlider Class Reference
[QxtGui]

A QSlider with two handles. More...

#include <qxtspanslider.h>

Collaboration diagram for QxtSpanSlider:
Collaboration graph
[legend]

List of all members.

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

Detailed Description

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:

OrientationKeyHandle
Qt::HorizontalQt::Key_Leftlower
Qt::HorizontalQt::Key_Rightlower
Qt::HorizontalQt::Key_Upupper
Qt::HorizontalQt::Key_Downupper
Qt::VerticalQt::Key_Uplower
Qt::VerticalQt::Key_Downlower
Qt::VerticalQt::Key_Leftupper
Qt::VerticalQt::Key_Rightupper

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.png

QxtSpanSlider in Plastique style.

Note:
QxtSpanSlider inherits QSlider for implementation specific reasons. Adjusting any single handle specific properties like
  • QAbstractSlider::sliderPosition
  • QAbstractSlider::value
has no effect. However, all slider specific properties like
  • QAbstractSlider::invertedAppearance
  • QAbstractSlider::invertedControls
  • QAbstractSlider::minimum
  • QAbstractSlider::maximum
  • QAbstractSlider::orientation
  • QAbstractSlider::pageStep
  • QAbstractSlider::singleStep
  • QSlider::tickInterval
  • QSlider::tickPosition
are taken into consideration.

Definition at line 35 of file qxtspanslider.h.


Member Enumeration Documentation

This enum describes the available handle movement modes.

Enumerator:
FreeMovement 

The handles can be moved freely.

NoCrossing 

The handles cannot cross, but they can still overlap each other. The lower and upper values can be the same.

NoOverlapping 

The handles cannot overlap each other. The lower and upper values cannot be the same.

Definition at line 51 of file qxtspanslider.h.


Constructor & Destructor Documentation

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]

Destructs the slider.

Definition at line 439 of file qxtspanslider.cpp.

{
}

Member Function Documentation

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]
void QxtSpanSlider::setSpan ( int  lower,
int  upper 
) [slot]

Sets the span from lower to upper.

See also:
upperValue, lowerValue

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]
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().


Friends And Related Function Documentation

friend class QxtSpanSliderPrivate [friend]

Definition at line 38 of file qxtspanslider.h.


Property Documentation

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().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines