void ScrollBar::paintEvent(QPaintEvent *) { QPainter painter(this); painter.fillRect(rect(), QBrush(QColor(200,200,255), Qt::BDiagPattern)); if (!drawScrollBar()) { return; } // bar width(height) const int bar_size = base_size_ / 2; const int draw_bar_size = drawBarSize(); const int pos = sliderPositionFromValue(value_, draw_bar_size); if (orientation_ == Qt::Horizontal) { // absolute bar(down side) // relative bar(upper side) } if (orientation_ == Qt::Vertical) { //qDebug() << "paint pos:" << pos << " size:" << draw_bar_size; // absolute bar(right side) painter.fillRect(bar_size, pos, bar_size, draw_bar_size, QBrush(QColor(255, 255, 0, 160))); // relative bar(left side) } }
void ScrollBar::mousePressEvent(QMouseEvent *ev) { if (isScrollBarArea(ev->pos())) { // drag const int pos = (orientation_ == Qt::Horizontal ? ev->pos().x() : ev->pos().y()); bar_grabed_position_ = pos - sliderPositionFromValue(value_, drawBarSize()); mouse_grabed_ = true; emit sliderPressed(); grabMouse(); } else { // pageup/pagedown } }
bool ScrollBar::isScrollBarArea(const QPoint &mouse_pos) const { if (!drawScrollBar()) { return false; } const int bar_size = base_size_ / 2; const int draw_bar_size = drawBarSize(); const int pos = sliderPositionFromValue(value_, draw_bar_size); if (orientation_ == Qt::Horizontal) { //return QRect(bar_size, pos, bar_size, draw_bar_size).contains.contains(pos); } if (orientation_ == Qt::Vertical) { return QRect(bar_size, pos, bar_size, draw_bar_size).contains(mouse_pos); } return false; }
QRect GtkProxyStyle::subControlRect(ComplexControl control, const QStyleOptionComplex *option, SubControl subControl, const QWidget *widget) const { if (SB_Standard!=sbarType && CC_ScrollBar==control) { if (const QStyleOptionSlider *sb = qstyleoption_cast<const QStyleOptionSlider *>(option)) { QRect ret; bool horizontal(Qt::Horizontal==sb->orientation); int sbextent(pixelMetric(PM_ScrollBarExtent, sb, widget)), sliderMaxLength(horizontal ? sb->rect.width() : sb->rect.height()), sliderMinLength(pixelMetric(PM_ScrollBarSliderMin, sb, widget)), sliderLength; if (sb->maximum != sb->minimum) { uint valueRange = sb->maximum - sb->minimum; sliderLength = (sb->pageStep * sliderMaxLength) / (valueRange + sb->pageStep); if (sliderLength < sliderMinLength) { sliderLength = sliderMinLength; } if (sliderLength > sliderMaxLength) { sliderLength = sliderMaxLength; } } else { sliderLength = sliderMaxLength; } int sliderstart(sliderPositionFromValue(sb->minimum, sb->maximum, sb->sliderPosition, sliderMaxLength - sliderLength, sb->upsideDown)); // Subcontrols switch(subControl) { case SC_ScrollBarSubLine: case SC_ScrollBarAddLine: return QRect(); case SC_ScrollBarSubPage: if (horizontal) { ret.setRect(0, 0, sliderstart, sbextent); } else { ret.setRect(0, 0, sbextent, sliderstart); } break; case SC_ScrollBarAddPage: if (horizontal) { ret.setRect(sliderstart + sliderLength, 0, sliderMaxLength - sliderstart - sliderLength, sbextent); } else { ret.setRect(0, sliderstart + sliderLength, sbextent, sliderMaxLength - sliderstart - sliderLength); } break; case SC_ScrollBarGroove: if (horizontal) { ret=QRect(0, 0, sb->rect.width(), sb->rect.height()); } else { ret=QRect(0, 0, sb->rect.width(), sb->rect.height()); } break; case SC_ScrollBarSlider: if (horizontal) { ret=QRect(sliderstart, 0, sliderLength, sbextent); } else { ret=QRect(0, sliderstart, sbextent, sliderLength); } break; default: ret = baseStyle()->subControlRect(control, option, subControl, widget); break; } return visualRect(sb->direction/*Qt::LeftToRight*/, sb->rect, ret); } } return baseStyle()->subControlRect(control, option, subControl, widget); }
QRect KScrollBar::subControlRect(QStyle::SubControl sc) { QRect ret; const QRect scrollBarRect = QRect(QPoint(0, 0), size().toSize()); int sbextent = m_buttonHeight; switch (sc) { case QStyle::SC_ScrollBarSubLine: // top/left button if (m_orientation == Qt::Horizontal) { int buttonWidth = qMin(scrollBarRect.width() / 2, sbextent); ret.setRect(0, 0, buttonWidth, scrollBarRect.height()); } else { int buttonHeight = qMin(scrollBarRect.height() / 2, sbextent); ret.setRect(0, 0, scrollBarRect.width(), buttonHeight); } return ret; case QStyle::SC_ScrollBarAddLine: // bottom/right button if (m_orientation == Qt::Horizontal) { int buttonWidth = qMin(scrollBarRect.width()/2, sbextent); ret.setRect(scrollBarRect.width() - buttonWidth, 0, buttonWidth, scrollBarRect.height()); } else { int buttonHeight = qMin(scrollBarRect.height()/2, sbextent); ret.setRect(0, scrollBarRect.height() - buttonHeight, scrollBarRect.width(), buttonHeight); } return ret; } int maxlen = ((m_orientation == Qt::Horizontal) ? width() : height()) - (sbextent * 2); int sliderlen = sliderPixels(); int sliderstart = sbextent + sliderPositionFromValue(m_minimum, m_maximum, m_value, maxlen - sliderlen, false); switch (sc) { case QStyle::SC_ScrollBarSubPage: // between top/left button and slider if (m_orientation == Qt::Horizontal) ret.setRect(sbextent, 0, sliderstart - sbextent, scrollBarRect.height()); else ret.setRect(0, sbextent, scrollBarRect.width(), sliderstart - sbextent); break; case QStyle::SC_ScrollBarAddPage: // between bottom/right button and slider if (m_orientation == Qt::Horizontal) ret.setRect(sliderstart + sliderlen, 0, maxlen - sliderstart - sliderlen + sbextent, scrollBarRect.height()); else ret.setRect(0, sliderstart + sliderlen, scrollBarRect.width(), maxlen - sliderstart - sliderlen + sbextent); break; case QStyle::SC_ScrollBarGroove: if (m_orientation == Qt::Horizontal) ret.setRect(sbextent, 0, scrollBarRect.width() - sbextent * 2, scrollBarRect.height()); else ret.setRect(0, sbextent, scrollBarRect.width(), scrollBarRect.height() - sbextent * 2); break; case QStyle::SC_ScrollBarSlider: if (m_orientation == Qt::Horizontal) ret.setRect(sliderstart, 0, sliderlen, scrollBarRect.height()); else ret.setRect(0, sliderstart, scrollBarRect.width(), sliderlen); break; default: break; } return ret; }