📄 qscrollbar.cpp
字号:
return; setValue( value() + int(offset) ); offset -= int(offset);}/*!\reimp*/void QScrollBar::keyPressEvent( QKeyEvent *e ){ // <ul> // <li>Left/Right move a horizontal scrollbar by one line. // <li>Up/Down move a vertical scrollbar by one line. // <li>PageUp moves up one page. // <li>PageDown moves down one page. // <li>Home moves to the start (minValue()). // <li>End moves to the end (maxValue()). // </ul> // Note that unless you call setFocusPolicy(), the default NoFocus // will apply and the user will not be able to use the keyboard to // interact with the scrollbar. switch ( e->key() ) { case Key_Left: if ( orient == Horizontal ) subtractLine(); break; case Key_Right: if ( orient == Horizontal ) addLine(); break; case Key_Up: if ( orient == Vertical ) subtractLine(); break; case Key_Down: if ( orient == Vertical ) addLine(); break; case Key_PageUp: subtractPage(); break; case Key_PageDown: addPage(); break; case Key_Home: setValue( minValue() ); break; case Key_End: setValue( maxValue() ); break; default: e->ignore(); break; }}/*!\reimp*/void QScrollBar::resizeEvent( QResizeEvent * ){ positionSliderFromValue();}/*!\reimp*/void QScrollBar::paintEvent( QPaintEvent * ){ QPainter p( this ); drawControls( QStyle::AddLine | QStyle::SubLine | QStyle::AddPage | QStyle::SubPage | QStyle::Slider | QStyle::First | QStyle::Last, pressedControl, &p );}static QCOORD sliderStartPos = 0;/*!\reimp*/void QScrollBar::mousePressEvent( QMouseEvent *e ){ if ( !(e->button() == LeftButton || (/*style() == MotifStyle &&*/ e->button() == MidButton) ) ) return; if ( maxValue() == minValue() ) // nothing to be done return; clickedAt = TRUE; pressedControl = pointOver( e->pos() ); if ( (pressedControl == QStyle::AddPage || pressedControl == QStyle::SubPage || pressedControl == QStyle::Slider ) && /*style() == MotifStyle &&*/ e->button() == MidButton ) { int sliderMin, dummy2, dummy3, sliderLength; metrics( sliderMin, dummy2, sliderLength, dummy3 ); int newSliderPos = (HORIZONTAL ? e->pos().x() : e->pos().y()) - sliderLength/2; newSliderPos = QMAX( sliderMin, newSliderPos ); setValue( sliderPosToRangeValue(newSliderPos) ); sliderPos = newSliderPos; pressedControl = QStyle::Slider; } if ( pressedControl == QStyle::Slider ) { clickOffset = (QCOORD)( (HORIZONTAL ? e->pos().x() : e->pos().y()) - sliderPos ); slidePrevVal = value(); sliderStartPos = sliderPos; drawControls( pressedControl, pressedControl ); emit sliderPressed(); } else if ( pressedControl != QStyle::NoScroll ) { drawControls( pressedControl, pressedControl ); action( (QStyle::ScrollControl) pressedControl ); startAutoRepeat(); }}/*!\reimp*/void QScrollBar::mouseReleaseEvent( QMouseEvent *e ){ if ( !clickedAt || !( e->button() == LeftButton || e->button() == MidButton ) ) return; QStyle::ScrollControl tmp = (QStyle::ScrollControl) pressedControl; clickedAt = FALSE; stopAutoRepeat(); mouseMoveEvent( e ); // Might have moved since last mouse move event. pressedControl = QStyle::NoScroll; if (tmp == QStyle::Slider) { directSetValue( calculateValueFromSlider() ); emit sliderReleased(); if ( value() != prevValue() ) emit valueChanged( value() ); } drawControls( tmp, pressedControl ); if ( e->button() == MidButton ) repaint( FALSE );}/*!\reimp*/void QScrollBar::mouseMoveEvent( QMouseEvent *e ){ if ( !isVisible() ) { clickedAt = FALSE; return; } if ( !clickedAt || !(e->state() & LeftButton || ((e->state() & MidButton) /*&& style() == MotifStyle*/)) ) return; int newSliderPos; if ( pressedControl == QStyle::Slider ) { int sliderMin, sliderMax; sliderMinMax( sliderMin, sliderMax ); QRect r = rect(); int m = style().maximumSliderDragDistance(); if ( m >= 0 ) { if ( orientation() == Horizontal ) r.setRect( r.x() - m, r.y() - 2*m, r.width() + 2*m, r.height() + 4*m ); else r.setRect( r.x() - 2*m, r.y() - m, r.width() + 4*m, r.height() + 2*m ); if ( style() == WindowsStyle && !r.contains( e->pos() ) ) newSliderPos = sliderStartPos; else newSliderPos = (HORIZONTAL ? e->pos().x() : e->pos().y()) -clickOffset; } else newSliderPos = (HORIZONTAL ? e->pos().x() : e->pos().y()) -clickOffset; if ( newSliderPos < sliderMin ) newSliderPos = sliderMin; else if ( newSliderPos > sliderMax ) newSliderPos = sliderMax; if ( newSliderPos == sliderPos ) return; int newVal = sliderPosToRangeValue(newSliderPos); if ( newVal != slidePrevVal ) emit sliderMoved( newVal ); if ( track && newVal != value() ) { directSetValue( newVal ); // Set directly, painting done below emit valueChanged( value() ); } slidePrevVal = newVal; sliderPos = (QCOORD)newSliderPos; drawControls( QStyle::AddPage | QStyle::Slider | QStyle::SubPage, pressedControl ); } else if ( style() == WindowsStyle ) { // stop scrolling when the mouse pointer leaves a control // similar to push buttons if ( (int)pressedControl != pointOver( e->pos() ) ) { drawControls( pressedControl, QStyle::NoScroll ); stopAutoRepeat(); } else if ( !repeater ) { drawControls( pressedControl, pressedControl ); action( (QStyle::ScrollControl) pressedControl ); startAutoRepeat(); } }}/*! \fn int QScrollBar::sliderStart() const Returns the pixel position where the scroll bar slider starts. It is equivalent to sliderRect().y() for vertical scroll bars or sliderRect().x() for horizontal scroll bars.*//*! Returns the scroll bar slider rectangle. \sa sliderStart()*/QRect QScrollBar::sliderRect() const{ int sliderMin, sliderMax, sliderLength, buttonDim; metrics( sliderMin, sliderMax, sliderLength, buttonDim ); int b = style() == MotifStyle ? MOTIF_BORDER : 0; if ( HORIZONTAL ) return QRect( sliderStart(), b, sliderLength, height() - b*2 ); else return QRect( b, sliderStart(), width() - b*2, sliderLength );}void QScrollBar::positionSliderFromValue(){ sliderPos = (QCOORD)rangeValueToSliderPos( value() );}int QScrollBar::calculateValueFromSlider() const{ return sliderPosToRangeValue( sliderPos );}void QScrollBar::sliderMinMax( int &sliderMin, int &sliderMax) const{ int dummy1, dummy2; metrics( sliderMin, sliderMax, dummy1, dummy2 );}void QScrollBar::metrics( int &sliderMin, int &sliderMax, int &sliderLength, int& buttonDim ) const{ style().scrollBarMetrics( this, sliderMin, sliderMax, sliderLength, buttonDim);}QStyle::ScrollControl QScrollBar::pointOver(const QPoint &p) const{ return style().scrollBarPointOver(this, sliderStart(), p);}int QScrollBar::rangeValueToSliderPos( int v ) const{ int sliderMin, sliderMax; sliderMinMax( sliderMin, sliderMax ); return positionFromValue( v, sliderMax-sliderMin ) + sliderMin;}int QScrollBar::sliderPosToRangeValue( int pos ) const{ int sliderMin, sliderMax; sliderMinMax( sliderMin, sliderMax ); return valueFromPosition( pos - sliderMin, sliderMax - sliderMin );}void QScrollBar::action( QStyle::ScrollControl control ){ switch( control ) { case QStyle::AddLine: emit nextLine(); addLine(); break; case QStyle::SubLine: emit prevLine(); subtractLine(); break; case QStyle::AddPage: emit nextPage(); addPage(); break; case QStyle::SubPage: emit prevPage(); subtractPage(); break; case QStyle::First: emit valueChanged( minValue() ); setValue( minValue() ); break; case QStyle::Last: emit valueChanged( maxValue() ); setValue( maxValue() ); break; default:#if defined(CHECK_RANGE) qWarning( "QScrollBar::action: (%s) internal error", name() );#else ;#endif }}void QScrollBar::drawControls( uint controls, uint activeControl ) const{ if (isVisible()) { QPainter p ( this ); drawControls( controls, activeControl, &p ); }}void QScrollBar::drawControls( uint controls, uint activeControl, QPainter *p ) const{ style().drawScrollBarControls( p, this, sliderStart(), controls, activeControl); return;}/*!\reimp */void QScrollBar::styleChange( QStyle& old ){ positionSliderFromValue(); if ( style() == MotifStyle ) setBackgroundMode( PaletteMid ); else setBackgroundMode( PaletteBackground ); QWidget::styleChange( old );}/*! \reimp*/int QScrollBar::minValue() const{ return QRangeControl::minValue();}/*! \reimp*/int QScrollBar::maxValue() const{ return QRangeControl::maxValue();}/*! A convenience function which just calls setRange( i, maxValue() ) \sa setRange()*/void QScrollBar::setMinValue( int i ){ setRange( i, maxValue() );}/*! A convenience function which just calls setRange( minValue(), i ) \sa setRange()*/void QScrollBar::setMaxValue( int i ){ setRange( minValue(), i );}/*! \reimp*/int QScrollBar::lineStep() const{ return QRangeControl::lineStep();}/*! \reimp*/int QScrollBar::pageStep() const{ return QRangeControl::pageStep();}/*! Sets the line step to \e i. Calls the virtual stepChange() function if the new line step is different from the previous setting. \sa lineStep() QRangeControl::setSteps() setPageStep() setRange()*/void QScrollBar::setLineStep( int i ){ setSteps( i, pageStep() );}/*! Sets the page step to \e i. Calls the virtual stepChange() function if the new page step is different from the previous setting. \sa pageStep() QRangeControl::setSteps() setLineStep() setRange()*/void QScrollBar::setPageStep( int i ){ setSteps( lineStep(), i );}/*! \reimp*/int QScrollBar::value() const{ return QRangeControl::value();}/*! \reimp*/void QScrollBar::setValue( int i ){ QRangeControl::setValue( i );}#undef ADD_LINE_ACTIVE#undef SUB_LINE_ACTIVE#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -