src/gui/widgets/qslider.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtGui module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "qslider.h"
       
    43 #ifndef QT_NO_SLIDER
       
    44 #ifndef QT_NO_ACCESSIBILITY
       
    45 #include "qaccessible.h"
       
    46 #endif
       
    47 #include "qapplication.h"
       
    48 #include "qevent.h"
       
    49 #include "qpainter.h"
       
    50 #include "qstyle.h"
       
    51 #include "qstyleoption.h"
       
    52 #include "private/qabstractslider_p.h"
       
    53 #include "qdebug.h"
       
    54 
       
    55 QT_BEGIN_NAMESPACE
       
    56 
       
    57 class QSliderPrivate : public QAbstractSliderPrivate
       
    58 {
       
    59     Q_DECLARE_PUBLIC(QSlider)
       
    60 public:
       
    61     QStyle::SubControl pressedControl;
       
    62     int tickInterval;
       
    63     QSlider::TickPosition tickPosition;
       
    64     int clickOffset;
       
    65     void init();
       
    66 	void resetLayoutItemMargins();
       
    67     int pixelPosToRangeValue(int pos) const;
       
    68     inline int pick(const QPoint &pt) const;
       
    69 
       
    70     QStyle::SubControl newHoverControl(const QPoint &pos);
       
    71     bool updateHoverControl(const QPoint &pos);
       
    72     QStyle::SubControl hoverControl;
       
    73     QRect hoverRect;
       
    74 };
       
    75 
       
    76 void QSliderPrivate::init()
       
    77 {
       
    78     Q_Q(QSlider);
       
    79     pressedControl = QStyle::SC_None;
       
    80     tickInterval = 0;
       
    81     tickPosition = QSlider::NoTicks;
       
    82     hoverControl = QStyle::SC_None;
       
    83     q->setFocusPolicy(Qt::FocusPolicy(q->style()->styleHint(QStyle::SH_Button_FocusPolicy)));
       
    84     QSizePolicy sp(QSizePolicy::Expanding, QSizePolicy::Fixed, QSizePolicy::Slider);
       
    85     if (orientation == Qt::Vertical)
       
    86         sp.transpose();
       
    87     q->setSizePolicy(sp);
       
    88     q->setAttribute(Qt::WA_WState_OwnSizePolicy, false);
       
    89 	resetLayoutItemMargins();
       
    90 }
       
    91 
       
    92 void QSliderPrivate::resetLayoutItemMargins()
       
    93 {
       
    94     Q_Q(QSlider);
       
    95     QStyleOptionSlider opt;
       
    96     q->initStyleOption(&opt);
       
    97     setLayoutItemMargins(QStyle::SE_SliderLayoutItem, &opt);
       
    98 }
       
    99 
       
   100 int QSliderPrivate::pixelPosToRangeValue(int pos) const
       
   101 {
       
   102     Q_Q(const QSlider);
       
   103     QStyleOptionSlider opt;
       
   104     q->initStyleOption(&opt);
       
   105     QRect gr = q->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, q);
       
   106     QRect sr = q->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, q);
       
   107     int sliderMin, sliderMax, sliderLength;
       
   108 
       
   109     if (orientation == Qt::Horizontal) {
       
   110         sliderLength = sr.width();
       
   111         sliderMin = gr.x();
       
   112         sliderMax = gr.right() - sliderLength + 1;
       
   113     } else {
       
   114         sliderLength = sr.height();
       
   115         sliderMin = gr.y();
       
   116         sliderMax = gr.bottom() - sliderLength + 1;
       
   117     }
       
   118     return QStyle::sliderValueFromPosition(minimum, maximum, pos - sliderMin,
       
   119                                            sliderMax - sliderMin, opt.upsideDown);
       
   120 }
       
   121 
       
   122 inline int QSliderPrivate::pick(const QPoint &pt) const
       
   123 {
       
   124     return orientation == Qt::Horizontal ? pt.x() : pt.y();
       
   125 }
       
   126 
       
   127 /*!
       
   128     Initialize \a option with the values from this QSlider. This method
       
   129     is useful for subclasses when they need a QStyleOptionSlider, but don't want
       
   130     to fill in all the information themselves.
       
   131 
       
   132     \sa QStyleOption::initFrom()
       
   133 */
       
   134 void QSlider::initStyleOption(QStyleOptionSlider *option) const
       
   135 {
       
   136     if (!option)
       
   137         return;
       
   138 
       
   139     Q_D(const QSlider);
       
   140     option->initFrom(this);
       
   141     option->subControls = QStyle::SC_None;
       
   142     option->activeSubControls = QStyle::SC_None;
       
   143     option->orientation = d->orientation;
       
   144     option->maximum = d->maximum;
       
   145     option->minimum = d->minimum;
       
   146     option->tickPosition = (QSlider::TickPosition)d->tickPosition;
       
   147     option->tickInterval = d->tickInterval;
       
   148     option->upsideDown = (d->orientation == Qt::Horizontal) ?
       
   149                      (d->invertedAppearance != (option->direction == Qt::RightToLeft))
       
   150                      : (!d->invertedAppearance);
       
   151     option->direction = Qt::LeftToRight; // we use the upsideDown option instead
       
   152     option->sliderPosition = d->position;
       
   153     option->sliderValue = d->value;
       
   154     option->singleStep = d->singleStep;
       
   155     option->pageStep = d->pageStep;
       
   156     if (d->orientation == Qt::Horizontal)
       
   157         option->state |= QStyle::State_Horizontal;
       
   158 }
       
   159 
       
   160 bool QSliderPrivate::updateHoverControl(const QPoint &pos)
       
   161 {
       
   162     Q_Q(QSlider);
       
   163     QRect lastHoverRect = hoverRect;
       
   164     QStyle::SubControl lastHoverControl = hoverControl;
       
   165     bool doesHover = q->testAttribute(Qt::WA_Hover);
       
   166     if (lastHoverControl != newHoverControl(pos) && doesHover) {
       
   167         q->update(lastHoverRect);
       
   168         q->update(hoverRect);
       
   169         return true;
       
   170     }
       
   171     return !doesHover;
       
   172 }
       
   173 
       
   174 QStyle::SubControl QSliderPrivate::newHoverControl(const QPoint &pos)
       
   175 {
       
   176     Q_Q(QSlider);
       
   177     QStyleOptionSlider opt;
       
   178     q->initStyleOption(&opt);
       
   179     opt.subControls = QStyle::SC_All;
       
   180     QRect handleRect = q->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, q);
       
   181     QRect grooveRect = q->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, q);
       
   182     QRect tickmarksRect = q->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderTickmarks, q);
       
   183 
       
   184     if (handleRect.contains(pos)) {
       
   185         hoverRect = handleRect;
       
   186         hoverControl = QStyle::SC_SliderHandle;
       
   187     } else if (grooveRect.contains(pos)) {
       
   188         hoverRect = grooveRect;
       
   189         hoverControl = QStyle::SC_SliderGroove;
       
   190     } else if (tickmarksRect.contains(pos)) {
       
   191         hoverRect = tickmarksRect;
       
   192         hoverControl = QStyle::SC_SliderTickmarks;
       
   193     } else {
       
   194         hoverRect = QRect();
       
   195         hoverControl = QStyle::SC_None;
       
   196     }
       
   197 
       
   198     return hoverControl;
       
   199 }
       
   200 
       
   201 /*!
       
   202     \class QSlider
       
   203     \brief The QSlider widget provides a vertical or horizontal slider.
       
   204 
       
   205     \ingroup basicwidgets
       
   206 
       
   207 
       
   208     The slider is the classic widget for controlling a bounded value.
       
   209     It lets the user move a slider handle along a horizontal or vertical
       
   210     groove and translates the handle's position into an integer value
       
   211     within the legal range.
       
   212 
       
   213     QSlider has very few of its own functions; most of the functionality is in
       
   214     QAbstractSlider. The most useful functions are setValue() to set
       
   215     the slider directly to some value; triggerAction() to simulate
       
   216     the effects of clicking (useful for shortcut keys);
       
   217     setSingleStep(), setPageStep() to set the steps; and setMinimum()
       
   218     and setMaximum() to define the range of the scroll bar.
       
   219 
       
   220     QSlider provides methods for controlling tickmarks.  You can use
       
   221     setTickPosition() to indicate where you want the tickmarks to be,
       
   222     setTickInterval() to indicate how many of them you want. the
       
   223     currently set tick position and interval can be queried using the
       
   224     tickPosition() and tickInterval() functions, respectively.
       
   225 
       
   226     QSlider inherits a comprehensive set of signals:
       
   227     \table
       
   228     \header \o Signal \o Description
       
   229     \row \o \l valueChanged()
       
   230     \o Emitted when the slider's value has changed. The tracking()
       
   231        determines whether this signal is emitted during user
       
   232        interaction.
       
   233     \row \o \l sliderPressed()
       
   234     \o Emitted when the user starts to drag the slider.
       
   235     \row \o \l sliderMoved()
       
   236     \o Emitted when the user drags the slider.
       
   237     \row \o \l sliderReleased()
       
   238     \o Emitted when the user releases the slider.
       
   239     \endtable
       
   240 
       
   241     QSlider only provides integer ranges. Note that although
       
   242     QSlider handles very large numbers, it becomes difficult for users
       
   243     to use a slider accurately for very large ranges.
       
   244 
       
   245     A slider accepts focus on Tab and provides both a mouse wheel and a
       
   246     keyboard interface. The keyboard interface is the following:
       
   247 
       
   248     \list
       
   249         \o Left/Right move a horizontal slider by one single step.
       
   250         \o Up/Down move a vertical slider by one single step.
       
   251         \o PageUp moves up one page.
       
   252         \o PageDown moves down one page.
       
   253         \o Home moves to the start (mininum).
       
   254         \o End moves to the end (maximum).
       
   255     \endlist
       
   256 
       
   257     \table 100%
       
   258     \row \o \inlineimage macintosh-slider.png Screenshot of a Macintosh slider
       
   259          \o A slider shown in the \l{Macintosh Style Widget Gallery}{Macintosh widget style}.
       
   260     \row \o \inlineimage windows-slider.png Screenshot of a Windows XP slider
       
   261          \o A slider shown in the \l{Windows XP Style Widget Gallery}{Windows XP widget style}.
       
   262     \row \o \inlineimage plastique-slider.png Screenshot of a Plastique slider
       
   263          \o A slider shown in the \l{Plastique Style Widget Gallery}{Plastique widget style}.
       
   264     \endtable
       
   265 
       
   266     \sa QScrollBar, QSpinBox, QDial, {fowler}{GUI Design Handbook: Slider}, {Sliders Example}
       
   267 */
       
   268 
       
   269 
       
   270 /*!
       
   271     \enum QSlider::TickPosition
       
   272 
       
   273     This enum specifies where the tick marks are to be drawn relative
       
   274     to the slider's groove and the handle the user moves.
       
   275 
       
   276     \value NoTicks Do not draw any tick marks.
       
   277     \value TicksBothSides Draw tick marks on both sides of the groove.
       
   278     \value TicksAbove Draw tick marks above the (horizontal) slider
       
   279     \value TicksBelow Draw tick marks below the (horizontal) slider
       
   280     \value TicksLeft Draw tick marks to the left of the (vertical) slider
       
   281     \value TicksRight Draw tick marks to the right of the (vertical) slider
       
   282 
       
   283     \omitvalue NoMarks
       
   284     \omitvalue Above
       
   285     \omitvalue Left
       
   286     \omitvalue Below
       
   287     \omitvalue Right
       
   288     \omitvalue Both
       
   289 */
       
   290 
       
   291 
       
   292 /*!
       
   293     Constructs a vertical slider with the given \a parent.
       
   294 */
       
   295 QSlider::QSlider(QWidget *parent)
       
   296     : QAbstractSlider(*new QSliderPrivate, parent)
       
   297 {
       
   298     d_func()->orientation = Qt::Vertical;
       
   299     d_func()->init();
       
   300 }
       
   301 
       
   302 /*!
       
   303     Constructs a slider with the given \a parent. The \a orientation
       
   304     parameter determines whether the slider is horizontal or vertical;
       
   305     the valid values are Qt::Vertical and Qt::Horizontal.
       
   306 */
       
   307 
       
   308 QSlider::QSlider(Qt::Orientation orientation, QWidget *parent)
       
   309     : QAbstractSlider(*new QSliderPrivate, parent)
       
   310 {
       
   311     d_func()->orientation = orientation;
       
   312     d_func()->init();
       
   313 }
       
   314 
       
   315 #ifdef QT3_SUPPORT
       
   316 /*!
       
   317     Use QSlider() and QObject::setObjectName() instead.
       
   318 
       
   319     \oldcode
       
   320         QSlider *mySlider = new QSlider(parent, name);
       
   321     \newcode
       
   322         QSlider *mySlider = new QSlider(parent);
       
   323         mySlider->setObjectName(name);
       
   324     \endcode
       
   325 */
       
   326 QSlider::QSlider(QWidget *parent, const char *name)
       
   327     : QAbstractSlider(*new QSliderPrivate, parent)
       
   328 {
       
   329     setObjectName(QString::fromAscii(name));
       
   330     d_func()->orientation = Qt::Vertical;
       
   331     d_func()->init();
       
   332 }
       
   333 
       
   334 /*!
       
   335     Use QSlider() and QObject::setObjectName() instead.
       
   336 
       
   337     \oldcode
       
   338         QSlider *mySlider = new QSlider(orientation, parent, name);
       
   339     \newcode
       
   340         QSlider *mySlider = new QSlider(orientation, parent);
       
   341         mySlider->setObjectName(name);
       
   342     \endcode
       
   343 */
       
   344 QSlider::QSlider(Qt::Orientation orientation, QWidget *parent, const char *name)
       
   345     : QAbstractSlider(*new QSliderPrivate, parent)
       
   346 {
       
   347     setObjectName(QString::fromAscii(name));
       
   348     d_func()->orientation = orientation;
       
   349     d_func()->init();
       
   350 }
       
   351 
       
   352 /*!
       
   353     Use QSlider(), QObject::setObjectName() and the functionality
       
   354     inherited from QAbstractSlider instead.
       
   355 
       
   356     \oldcode
       
   357         QSlider *mySlider = new QSlider(minValue, maxValue, pageStep,
       
   358                                         value, orientation, parent, name);
       
   359     \newcode
       
   360         QSlider *mySlider = new QSlider(orientation, parent);
       
   361         mySlider->setObjectName(name);
       
   362         mySlider->setMinimum(minValue);
       
   363         mySlider->setMaximum(maxValue);
       
   364         mySlider->setPageStep(pageStep);
       
   365         mySlider->setValue(value);
       
   366     \endcode
       
   367 */
       
   368 QSlider::QSlider(int minValue, int maxValue, int pageStep, int value, Qt::Orientation orientation,
       
   369                  QWidget *parent, const char *name)
       
   370     : QAbstractSlider(*new QSliderPrivate, parent)
       
   371 {
       
   372     Q_D(QSlider);
       
   373     setObjectName(QString::fromAscii(name));
       
   374     d->minimum = minValue;
       
   375     d->maximum = maxValue;
       
   376     d->pageStep = pageStep;
       
   377     d->position = d->value = value;
       
   378     d->orientation = orientation;
       
   379     d->init();
       
   380 }
       
   381 #endif
       
   382 
       
   383 /*!
       
   384     Destroys this slider.
       
   385 */
       
   386 QSlider::~QSlider()
       
   387 {
       
   388 }
       
   389 
       
   390 /*!
       
   391     \reimp
       
   392 */
       
   393 void QSlider::paintEvent(QPaintEvent *)
       
   394 {
       
   395     Q_D(QSlider);
       
   396     QPainter p(this);
       
   397     QStyleOptionSlider opt;
       
   398     initStyleOption(&opt);
       
   399 
       
   400     opt.subControls = QStyle::SC_SliderGroove | QStyle::SC_SliderHandle;
       
   401     if (d->tickPosition != NoTicks)
       
   402         opt.subControls |= QStyle::SC_SliderTickmarks;
       
   403     if (d->pressedControl) {
       
   404         opt.activeSubControls = d->pressedControl;
       
   405         opt.state |= QStyle::State_Sunken;
       
   406     } else {
       
   407         opt.activeSubControls = d->hoverControl;
       
   408     }
       
   409 
       
   410     style()->drawComplexControl(QStyle::CC_Slider, &opt, &p, this);
       
   411 }
       
   412 
       
   413 /*!
       
   414     \reimp
       
   415 */
       
   416 
       
   417 bool QSlider::event(QEvent *event)
       
   418 {
       
   419     Q_D(QSlider);
       
   420 
       
   421     switch(event->type()) {
       
   422     case QEvent::HoverEnter:
       
   423     case QEvent::HoverLeave:
       
   424     case QEvent::HoverMove:
       
   425         if (const QHoverEvent *he = static_cast<const QHoverEvent *>(event))
       
   426             d->updateHoverControl(he->pos());
       
   427         break;
       
   428     case QEvent::StyleChange:
       
   429     case QEvent::MacSizeChange:
       
   430         d->resetLayoutItemMargins();
       
   431         break;
       
   432     default:
       
   433         break;
       
   434     }
       
   435     return QAbstractSlider::event(event);
       
   436 }
       
   437 
       
   438 /*!
       
   439     \reimp
       
   440 */
       
   441 void QSlider::mousePressEvent(QMouseEvent *ev)
       
   442 {
       
   443     Q_D(QSlider);
       
   444     if (d->maximum == d->minimum || (ev->buttons() ^ ev->button())) {
       
   445         ev->ignore();
       
   446         return;
       
   447     }
       
   448 #ifdef QT_KEYPAD_NAVIGATION
       
   449     if (QApplication::keypadNavigationEnabled())
       
   450         setEditFocus(true);
       
   451 #endif
       
   452     ev->accept();
       
   453     if ((ev->button() & style()->styleHint(QStyle::SH_Slider_AbsoluteSetButtons)) == ev->button()) {
       
   454         QStyleOptionSlider opt;
       
   455         initStyleOption(&opt);
       
   456         const QRect sliderRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
       
   457         const QPoint center = sliderRect.center() - sliderRect.topLeft();
       
   458         // to take half of the slider off for the setSliderPosition call we use the center - topLeft
       
   459 
       
   460         setSliderPosition(d->pixelPosToRangeValue(d->pick(ev->pos() - center)));
       
   461         triggerAction(SliderMove);
       
   462         setRepeatAction(SliderNoAction);
       
   463         d->pressedControl = QStyle::SC_SliderHandle;
       
   464         update();
       
   465     } else if ((ev->button() & style()->styleHint(QStyle::SH_Slider_PageSetButtons)) == ev->button()) {
       
   466         QStyleOptionSlider opt;
       
   467         initStyleOption(&opt);
       
   468         d->pressedControl = style()->hitTestComplexControl(QStyle::CC_Slider,
       
   469                                                            &opt, ev->pos(), this);
       
   470         SliderAction action = SliderNoAction;
       
   471         if (d->pressedControl == QStyle::SC_SliderGroove) {
       
   472             const QRect sliderRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
       
   473             int pressValue = d->pixelPosToRangeValue(d->pick(ev->pos() - sliderRect.center() + sliderRect.topLeft()));
       
   474             d->pressValue = pressValue;
       
   475             if (pressValue > d->value)
       
   476                 action = SliderPageStepAdd;
       
   477             else if (pressValue < d->value)
       
   478                 action = SliderPageStepSub;
       
   479             if (action) {
       
   480                 triggerAction(action);
       
   481                 setRepeatAction(action);
       
   482             }
       
   483         }
       
   484     } else {
       
   485         ev->ignore();
       
   486         return;
       
   487     }
       
   488 
       
   489     if (d->pressedControl == QStyle::SC_SliderHandle) {
       
   490         QStyleOptionSlider opt;
       
   491         initStyleOption(&opt);
       
   492         setRepeatAction(SliderNoAction);
       
   493         QRect sr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
       
   494         d->clickOffset = d->pick(ev->pos() - sr.topLeft());
       
   495         update(sr);
       
   496         setSliderDown(true);
       
   497     }
       
   498 }
       
   499 
       
   500 /*!
       
   501     \reimp
       
   502 */
       
   503 void QSlider::mouseMoveEvent(QMouseEvent *ev)
       
   504 {
       
   505     Q_D(QSlider);
       
   506     if (d->pressedControl != QStyle::SC_SliderHandle) {
       
   507         ev->ignore();
       
   508         return;
       
   509     }
       
   510     ev->accept();
       
   511     int newPosition = d->pixelPosToRangeValue(d->pick(ev->pos()) - d->clickOffset);
       
   512     QStyleOptionSlider opt;
       
   513     initStyleOption(&opt);
       
   514     setSliderPosition(newPosition);
       
   515 }
       
   516 
       
   517 
       
   518 /*!
       
   519     \reimp
       
   520 */
       
   521 void QSlider::mouseReleaseEvent(QMouseEvent *ev)
       
   522 {
       
   523     Q_D(QSlider);
       
   524     if (d->pressedControl == QStyle::SC_None || ev->buttons()) {
       
   525         ev->ignore();
       
   526         return;
       
   527     }
       
   528     ev->accept();
       
   529     QStyle::SubControl oldPressed = QStyle::SubControl(d->pressedControl);
       
   530     d->pressedControl = QStyle::SC_None;
       
   531     setRepeatAction(SliderNoAction);
       
   532     if (oldPressed == QStyle::SC_SliderHandle)
       
   533         setSliderDown(false);
       
   534     QStyleOptionSlider opt;
       
   535     initStyleOption(&opt);
       
   536     opt.subControls = oldPressed;
       
   537     update(style()->subControlRect(QStyle::CC_Slider, &opt, oldPressed, this));
       
   538 }
       
   539 
       
   540 /*!
       
   541     \reimp
       
   542 */
       
   543 QSize QSlider::sizeHint() const
       
   544 {
       
   545     Q_D(const QSlider);
       
   546     ensurePolished();
       
   547     const int SliderLength = 84, TickSpace = 5;
       
   548     QStyleOptionSlider opt;
       
   549     initStyleOption(&opt);
       
   550     int thick = style()->pixelMetric(QStyle::PM_SliderThickness, &opt, this);
       
   551     if (d->tickPosition & TicksAbove)
       
   552         thick += TickSpace;
       
   553     if (d->tickPosition & TicksBelow)
       
   554         thick += TickSpace;
       
   555     int w = thick, h = SliderLength;
       
   556     if (d->orientation == Qt::Horizontal) {
       
   557         w = SliderLength;
       
   558         h = thick;
       
   559     }
       
   560     return style()->sizeFromContents(QStyle::CT_Slider, &opt, QSize(w, h), this).expandedTo(QApplication::globalStrut());
       
   561 }
       
   562 
       
   563 /*!
       
   564     \reimp
       
   565 */
       
   566 QSize QSlider::minimumSizeHint() const
       
   567 {
       
   568     Q_D(const QSlider);
       
   569     QSize s = sizeHint();
       
   570     QStyleOptionSlider opt;
       
   571     initStyleOption(&opt);
       
   572     int length = style()->pixelMetric(QStyle::PM_SliderLength, &opt, this);
       
   573     if (d->orientation == Qt::Horizontal)
       
   574         s.setWidth(length);
       
   575     else
       
   576         s.setHeight(length);
       
   577     return s;
       
   578 }
       
   579 
       
   580 /*!
       
   581     \property QSlider::tickPosition
       
   582     \brief the tickmark position for this slider
       
   583 
       
   584     The valid values are described by the QSlider::TickPosition enum.
       
   585 
       
   586     The default value is \l QSlider::NoTicks.
       
   587 
       
   588     \sa tickInterval
       
   589 */
       
   590 
       
   591 void QSlider::setTickPosition(TickPosition position)
       
   592 {
       
   593     Q_D(QSlider);
       
   594     d->tickPosition = position;
       
   595     d->resetLayoutItemMargins();
       
   596     update();
       
   597     updateGeometry();
       
   598 }
       
   599 
       
   600 QSlider::TickPosition QSlider::tickPosition() const
       
   601 {
       
   602     return d_func()->tickPosition;
       
   603 }
       
   604 
       
   605 /*!
       
   606     \fn TickPosition QSlider::tickmarks() const
       
   607     \compat
       
   608 
       
   609     Use tickPosition() instead.
       
   610 */
       
   611 
       
   612 /*!
       
   613     \fn QSlider::setTickmarks(TickPosition position)
       
   614     \compat
       
   615 
       
   616     Use setTickPosition() instead.
       
   617 */
       
   618 
       
   619 /*!
       
   620     \property QSlider::tickInterval
       
   621     \brief the interval between tickmarks
       
   622 
       
   623     This is a value interval, not a pixel interval. If it is 0, the
       
   624     slider will choose between lineStep() and pageStep().
       
   625 
       
   626     The default value is 0.
       
   627 
       
   628     \sa tickPosition, lineStep(), pageStep()
       
   629 */
       
   630 
       
   631 void QSlider::setTickInterval(int ts)
       
   632 {
       
   633     d_func()->tickInterval = qMax(0, ts);
       
   634     update();
       
   635 }
       
   636 
       
   637 int QSlider::tickInterval() const
       
   638 {
       
   639     return d_func()->tickInterval;
       
   640 }
       
   641 
       
   642 /*!
       
   643     \fn void QSlider::addStep()
       
   644 
       
   645     Use setValue() instead.
       
   646 */
       
   647 
       
   648 /*!
       
   649     \fn void QSlider::subtractStep()
       
   650 
       
   651     Use setValue() instead.
       
   652 */
       
   653 
       
   654 /*! \internal
       
   655     Returns the style option for slider.
       
   656 */
       
   657 Q_GUI_EXPORT QStyleOptionSlider qt_qsliderStyleOption(QSlider *slider)
       
   658 {
       
   659     QStyleOptionSlider sliderOption;
       
   660     slider->initStyleOption(&sliderOption);
       
   661     return sliderOption;
       
   662 }
       
   663 
       
   664 #endif
       
   665 
       
   666 QT_END_NAMESPACE