📄 qscrollbar.cpp
字号:
QScrollBar::QScrollBar(Qt::Orientation orientation, QWidget *parent, const char *name) : QAbstractSlider(*new QScrollBarPrivate, parent){ setObjectName(QString::fromAscii(name)); d_func()->orientation = orientation; d_func()->init();}/*! Use one of the constructors that doesn't take the \a name argument and then use setObjectName() instead.*/QScrollBar::QScrollBar(int minimum, int maximum, int lineStep, int pageStep, int value, Qt::Orientation orientation, QWidget *parent, const char *name) : QAbstractSlider(*new QScrollBarPrivate, parent){ Q_D(QScrollBar); setObjectName(QString::fromAscii(name)); d->minimum = minimum; d->maximum = maximum; d->singleStep = lineStep; d->pageStep = pageStep; d->value = value; d->orientation = orientation; d->init();}#endif // QT3_SUPPORT/*! Destroys the scroll bar.*/QScrollBar::~QScrollBar(){}void QScrollBarPrivate::init(){ Q_Q(QScrollBar); invertedControls = true; pressedControl = hoverControl = QStyle::SC_None; pointerOutsidePressedControl = false; q->setFocusPolicy(Qt::NoFocus); QSizePolicy sp(QSizePolicy::Minimum, QSizePolicy::Fixed, QSizePolicy::Slider); if (orientation == Qt::Vertical) sp.transpose(); q->setSizePolicy(sp); q->setAttribute(Qt::WA_WState_OwnSizePolicy, false); q->setAttribute(Qt::WA_OpaquePaintEvent);}/*! \reimp */void QScrollBar::contextMenuEvent(QContextMenuEvent *event){ if (!style()->styleHint(QStyle::SH_ScrollBar_ContextMenu, 0, this)) { QAbstractSlider::contextMenuEvent(event); return ; }#ifndef QT_NO_MENU bool horiz = HORIZONTAL; QMenu menu; QAction *actScrollHere = menu.addAction(tr("Scroll here")); menu.addSeparator(); QAction *actScrollTop = menu.addAction(horiz ? tr("Left edge") : tr("Top")); QAction *actScrollBottom = menu.addAction(horiz ? tr("Right edge") : tr("Bottom")); menu.addSeparator(); QAction *actPageUp = menu.addAction(horiz ? tr("Page left") : tr("Page up")); QAction *actPageDn = menu.addAction(horiz ? tr("Page right") : tr("Page down")); menu.addSeparator(); QAction *actScrollUp = menu.addAction(horiz ? tr("Scroll left") : tr("Scroll up")); QAction *actScrollDn = menu.addAction(horiz ? tr("Scroll right") : tr("Scroll down")); QAction *actionSelected = menu.exec(event->globalPos()); if (actionSelected == 0) /* do nothing */ ; else if (actionSelected == actScrollHere) setValue(d_func()->pixelPosToRangeValue(horiz ? event->pos().x() : event->pos().y())); else if (actionSelected == actScrollTop) triggerAction(QAbstractSlider::SliderToMinimum); else if (actionSelected == actScrollBottom) triggerAction(QAbstractSlider::SliderToMaximum); else if (actionSelected == actPageUp) triggerAction(QAbstractSlider::SliderPageStepSub); else if (actionSelected == actPageDn) triggerAction(QAbstractSlider::SliderPageStepAdd); else if (actionSelected == actScrollUp) triggerAction(QAbstractSlider::SliderSingleStepSub); else if (actionSelected == actScrollDn) triggerAction(QAbstractSlider::SliderSingleStepAdd);#endif // QT_NO_MENU}/*! \reimp */QSize QScrollBar::sizeHint() const{ ensurePolished(); QStyleOptionSlider opt; initStyleOption(&opt); int scrollBarExtent = style()->pixelMetric(QStyle::PM_ScrollBarExtent, &opt, this); int scrollBarSliderMin = style()->pixelMetric(QStyle::PM_ScrollBarSliderMin, &opt, this); QSize size; if (opt.orientation == Qt::Horizontal) size = QSize(scrollBarExtent * 2 + scrollBarSliderMin, scrollBarExtent); else size = QSize(scrollBarExtent, scrollBarExtent * 2 + scrollBarSliderMin); return style()->sizeFromContents(QStyle::CT_ScrollBar, &opt, size, this) .expandedTo(QApplication::globalStrut()); }/*!\reimp */void QScrollBar::sliderChange(SliderChange change){ QAbstractSlider::sliderChange(change);}/*! \reimp*/bool QScrollBar::event(QEvent *event){ switch(event->type()) { case QEvent::HoverEnter: case QEvent::HoverLeave: case QEvent::HoverMove: if (const QHoverEvent *he = static_cast<const QHoverEvent *>(event)) d_func()->updateHoverControl(he->pos()); break; default: break; } return QAbstractSlider::event(event);}/*! \reimp*/void QScrollBar::paintEvent(QPaintEvent *){ Q_D(QScrollBar); QPainter p(this); QStyleOptionSlider opt; initStyleOption(&opt); opt.subControls = QStyle::SC_All; if (d->pressedControl) { opt.activeSubControls = (QStyle::SubControl)d->pressedControl; if (!d->pointerOutsidePressedControl) opt.state |= QStyle::State_Sunken; } else { opt.activeSubControls = (QStyle::SubControl)d->hoverControl; } style()->drawComplexControl(QStyle::CC_ScrollBar, &opt, &p, this);}/*! \reimp*/void QScrollBar::mousePressEvent(QMouseEvent *e){ Q_D(QScrollBar); bool midButtonAbsPos = style()->styleHint(QStyle::SH_ScrollBar_MiddleClickAbsolutePosition, 0, this); QStyleOptionSlider opt; initStyleOption(&opt); if (d->maximum == d->minimum // no range || (e->buttons() & (~e->button())) // another button was clicked before || !(e->button() == Qt::LeftButton || (midButtonAbsPos && e->button() == Qt::MidButton))) return; d->pressedControl = style()->hitTestComplexControl(QStyle::CC_ScrollBar, &opt, e->pos(), this); d->pointerOutsidePressedControl = false; QRect sr = style()->subControlRect(QStyle::CC_ScrollBar, &opt, QStyle::SC_ScrollBarSlider, this); QPoint click = e->pos(); QPoint pressValue = click - sr.center() + sr.topLeft(); d->pressValue = d->orientation == Qt::Horizontal ? d->pixelPosToRangeValue(pressValue.x()) : d->pixelPosToRangeValue(pressValue.y()); if (d->pressedControl == QStyle::SC_ScrollBarSlider) { d->clickOffset = HORIZONTAL ? (click.x()-sr.x()) : (click.y()-sr.y()); d->snapBackPosition = d->position; } if ((d->pressedControl == QStyle::SC_ScrollBarAddPage || d->pressedControl == QStyle::SC_ScrollBarSubPage || d->pressedControl == QStyle::SC_ScrollBarSlider) && ((midButtonAbsPos && e->button() == Qt::MidButton) || style()->styleHint(QStyle::SH_ScrollBar_LeftClickAbsolutePosition, &opt, this) && e->button() == Qt::LeftButton)) { int sliderLength = HORIZONTAL ? sr.width() : sr.height(); setSliderPosition(d->pixelPosToRangeValue((HORIZONTAL ? e->pos().x() : e->pos().y()) - sliderLength / 2)); d->pressedControl = QStyle::SC_ScrollBarSlider; d->clickOffset = sliderLength / 2; } d->activateControl(d->pressedControl); repaint(style()->subControlRect(QStyle::CC_ScrollBar, &opt, d->pressedControl, this)); if (d->pressedControl == QStyle::SC_ScrollBarSlider) setSliderDown(true);}/*! \reimp*/void QScrollBar::mouseReleaseEvent(QMouseEvent *e){ Q_D(QScrollBar); if (!d->pressedControl) return; if (e->buttons() & (~e->button())) // some other button is still pressed return; QStyle::SubControl tmp = d->pressedControl; setRepeatAction(SliderNoAction); d->pressedControl = QStyle::SC_None; if (tmp == QStyle::SC_ScrollBarSlider) setSliderDown(false); QStyleOptionSlider opt; initStyleOption(&opt); repaint(style()->subControlRect(QStyle::CC_ScrollBar, &opt, tmp, this));}/*! \reimp*/void QScrollBar::mouseMoveEvent(QMouseEvent *e){ Q_D(QScrollBar); if (!d->pressedControl) return; QStyleOptionSlider opt; initStyleOption(&opt); if (!(e->buttons() & Qt::LeftButton || ((e->buttons() & Qt::MidButton) && style()->styleHint(QStyle::SH_ScrollBar_MiddleClickAbsolutePosition, &opt, this)))) return; if (d->pressedControl == QStyle::SC_ScrollBarSlider) { QPoint click = e->pos(); int newPosition = d->pixelPosToRangeValue((HORIZONTAL ? click.x() : click.y()) -d->clickOffset); int m = style()->pixelMetric(QStyle::PM_MaximumDragDistance, &opt, this); if (m >= 0) { QRect r = rect(); r.adjust(-m, -m, m, m); if (! r.contains(e->pos())) newPosition = d->snapBackPosition; } setSliderPosition(newPosition); } else if (!style()->styleHint(QStyle::SH_ScrollBar_ScrollWhenPointerLeavesControl, &opt, this)) { if (style()->styleHint(QStyle::SH_ScrollBar_RollBetweenButtons, &opt, this) && d->pressedControl & (QStyle::SC_ScrollBarAddLine | QStyle::SC_ScrollBarSubLine)) { QStyle::SubControl newSc = style()->hitTestComplexControl(QStyle::CC_ScrollBar, &opt, e->pos(), this); if (newSc == d->pressedControl && !d->pointerOutsidePressedControl) return; // nothing to do if (newSc & (QStyle::SC_ScrollBarAddLine | QStyle::SC_ScrollBarSubLine)) { d->pointerOutsidePressedControl = false; QRect scRect = style()->subControlRect(QStyle::CC_ScrollBar, &opt, newSc, this); scRect |= style()->subControlRect(QStyle::CC_ScrollBar, &opt, d->pressedControl, this); d->pressedControl = newSc; d->activateControl(d->pressedControl, 0); update(scRect); return; } } // stop scrolling when the mouse pointer leaves a control // similar to push buttons QRect pr = style()->subControlRect(QStyle::CC_ScrollBar, &opt, d->pressedControl, this); if (pr.contains(e->pos()) == d->pointerOutsidePressedControl) { if ((d->pointerOutsidePressedControl = !d->pointerOutsidePressedControl)) { d->pointerOutsidePressedControl = true; setRepeatAction(SliderNoAction); repaint(pr); } else { d->activateControl(d->pressedControl); } } }}int QScrollBarPrivate::pixelPosToRangeValue(int pos) const{ Q_Q(const QScrollBar); QStyleOptionSlider opt; q->initStyleOption(&opt); QRect gr = q->style()->subControlRect(QStyle::CC_ScrollBar, &opt, QStyle::SC_ScrollBarGroove, q); QRect sr = q->style()->subControlRect(QStyle::CC_ScrollBar, &opt, QStyle::SC_ScrollBarSlider, q); int sliderMin, sliderMax, sliderLength; if (orientation == Qt::Horizontal) { sliderLength = sr.width(); sliderMin = gr.x(); sliderMax = gr.right() - sliderLength + 1; if (q->layoutDirection() == Qt::RightToLeft) opt.upsideDown = !opt.upsideDown; } else { sliderLength = sr.height(); sliderMin = gr.y(); sliderMax = gr.bottom() - sliderLength + 1; } return QStyle::sliderValueFromPosition(minimum, maximum, pos - sliderMin, sliderMax - sliderMin, opt.upsideDown);}/*! \reimp*/void QScrollBar::hideEvent(QHideEvent *){ Q_D(QScrollBar); if (d->pressedControl) { d->pressedControl = QStyle::SC_None; setRepeatAction(SliderNoAction); }}/*! \fn bool QScrollBar::draggingSlider() Use isSliderDown() instead.*//*! \internal Returns the style option for scroll bar.*/Q_GUI_EXPORT QStyleOptionSlider qt_qscrollbarStyleOption(QScrollBar *scrollbar){ QStyleOptionSlider opt; scrollbar->initStyleOption(&opt); return opt;}#endif // QT_NO_SCROLLBAR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -