43 pressedControl = QStyle::SC_None;
45 tickPosition = QSlider::NoTicks;
46 hoverControl = QStyle::SC_None;
47 q->setFocusPolicy(Qt::FocusPolicy(q->style()->styleHint(QStyle::SH_Button_FocusPolicy,
nullptr, q)));
48 QSizePolicy sp(QSizePolicy::Expanding, QSizePolicy::Fixed, QSizePolicy::Slider);
49 if (orientation == Qt::Vertical)
52 q->setAttribute(Qt::WA_WState_OwnSizePolicy,
false);
69 QStyleOptionSlider opt;
70 q->initStyleOption(&opt);
71 QRect gr = q->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, q);
72 QRect sr = q->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, q);
73 int sliderMin, sliderMax, sliderLength;
75 if (orientation == Qt::Horizontal) {
76 sliderLength = sr.width();
78 sliderMax = gr.right() - sliderLength + 1;
80 sliderLength = sr.height();
82 sliderMax = gr.bottom() - sliderLength + 1;
84 return QStyle::sliderValueFromPosition(minimum, maximum, pos - sliderMin,
85 sliderMax - sliderMin, opt.upsideDown);
100void QSlider::initStyleOption(QStyleOptionSlider *option)
const
106 option->initFrom(
this);
107 option->subControls = QStyle::SC_None;
108 option->activeSubControls = QStyle::SC_None;
109 option->orientation = d->orientation;
110 option->maximum = d->maximum;
111 option->minimum = d->minimum;
112 option->tickPosition = (QSlider::TickPosition)d->tickPosition;
113 option->tickInterval = d->tickInterval;
114 option->upsideDown = (d->orientation == Qt::Horizontal) ?
115 (d->invertedAppearance != (option->direction == Qt::RightToLeft))
116 : (!d->invertedAppearance);
117 option->direction = Qt::LeftToRight;
118 option->sliderPosition = d->position;
119 option->sliderValue = d->value;
120 option->singleStep = d->singleStep;
121 option->pageStep = d->pageStep;
122 if (d->orientation == Qt::Horizontal)
123 option->state |= QStyle::State_Horizontal;
125 if (d->pressedControl) {
126 option->activeSubControls = d->pressedControl;
127 option->state |= QStyle::State_Sunken;
129 option->activeSubControls = d->hoverControl;
136 QRect lastHoverRect = hoverRect;
137 QStyle::SubControl lastHoverControl = hoverControl;
138 bool doesHover = q->testAttribute(Qt::WA_Hover);
139 if (lastHoverControl != newHoverControl(pos) && doesHover) {
140 q->update(lastHoverRect);
141 q->update(hoverRect);
150 QStyleOptionSlider opt;
151 q->initStyleOption(&opt);
152 opt.subControls = QStyle::SC_All;
153 QRect handleRect = q->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, q);
154 QRect grooveRect = q->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderGroove, q);
155 QRect tickmarksRect = q->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderTickmarks, q);
157 if (handleRect.contains(pos)) {
158 hoverRect = handleRect;
159 hoverControl = QStyle::SC_SliderHandle;
160 }
else if (grooveRect.contains(pos)) {
161 hoverRect = grooveRect;
162 hoverControl = QStyle::SC_SliderGroove;
163 }
else if (tickmarksRect.contains(pos)) {
164 hoverRect = tickmarksRect;
165 hoverControl = QStyle::SC_SliderTickmarks;
168 hoverControl = QStyle::SC_None;
283void QSlider::paintEvent(QPaintEvent *)
286 QStylePainter p(
this);
287 QStyleOptionSlider opt;
288 initStyleOption(&opt);
290 opt.subControls = QStyle::SC_SliderGroove | QStyle::SC_SliderHandle;
291 if (d->tickPosition != NoTicks)
292 opt.subControls |= QStyle::SC_SliderTickmarks;
294 p.drawComplexControl(QStyle::CC_Slider, opt);
325void QSlider::mousePressEvent(QMouseEvent *ev)
328 if (d->maximum == d->minimum || (ev->buttons() ^ ev->button())) {
332#ifdef QT_KEYPAD_NAVIGATION
333 if (QApplicationPrivate::keypadNavigationEnabled())
337 if ((ev->button() & style()->styleHint(QStyle::SH_Slider_AbsoluteSetButtons,
nullptr,
this)) == ev->button()) {
338 QStyleOptionSlider opt;
339 initStyleOption(&opt);
340 const QRect sliderRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle,
this);
341 const QPoint center = sliderRect.center() - sliderRect.topLeft();
344 setSliderPosition(d->pixelPosToRangeValue(d->pick(ev->position().toPoint() - center)));
345 triggerAction(SliderMove);
346 setRepeatAction(SliderNoAction);
347 d->pressedControl = QStyle::SC_SliderHandle;
349 }
else if ((ev->button() & style()->styleHint(QStyle::SH_Slider_PageSetButtons,
nullptr,
this)) == ev->button()) {
350 QStyleOptionSlider opt;
351 initStyleOption(&opt);
352 d->pressedControl = style()->hitTestComplexControl(QStyle::CC_Slider,
353 &opt, ev->position().toPoint(),
this);
354 SliderAction action = SliderNoAction;
355 if (d->pressedControl == QStyle::SC_SliderGroove) {
356 const QRect sliderRect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle,
this);
357 int pressValue = d->pixelPosToRangeValue(d->pick(ev->position().toPoint() - sliderRect.center() + sliderRect.topLeft()));
358 d->pressValue = pressValue;
359 if (pressValue > d->value)
360 action = SliderPageStepAdd;
361 else if (pressValue < d->value)
362 action = SliderPageStepSub;
364 triggerAction(action);
365 setRepeatAction(action);
373 if (d->pressedControl == QStyle::SC_SliderHandle) {
374 QStyleOptionSlider opt;
375 initStyleOption(&opt);
376 setRepeatAction(SliderNoAction);
377 QRect sr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle,
this);
378 d->clickOffset = d->pick(ev->position().toPoint() - sr.topLeft());
403void QSlider::mouseReleaseEvent(QMouseEvent *ev)
406 if (d->pressedControl == QStyle::SC_None || ev->buttons()) {
411 QStyle::SubControl oldPressed = QStyle::SubControl(d->pressedControl);
412 d->pressedControl = QStyle::SC_None;
413 setRepeatAction(SliderNoAction);
414 if (oldPressed == QStyle::SC_SliderHandle)
415 setSliderDown(
false);
416 QStyleOptionSlider opt;
417 initStyleOption(&opt);
418 opt.subControls = oldPressed;
419 update(style()->subControlRect(QStyle::CC_Slider, &opt, oldPressed,
this));
425QSize QSlider::sizeHint()
const
429 const int SliderLength = 84, TickSpace = 5;
430 QStyleOptionSlider opt;
431 initStyleOption(&opt);
432 int thick = style()->pixelMetric(QStyle::PM_SliderThickness, &opt,
this);
433 if (d->tickPosition & TicksAbove)
435 if (d->tickPosition & TicksBelow)
437 int w = thick, h = SliderLength;
438 if (d->orientation == Qt::Horizontal) {
442 return style()->sizeFromContents(QStyle::CT_Slider, &opt, QSize(w, h),
this);