⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qscrollbar.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
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 + -