diff options
author | Olivier Goffart <ogoffart@trolltech.com> | 2010-04-14 09:28:09 (GMT) |
---|---|---|
committer | Olivier Goffart <ogoffart@trolltech.com> | 2010-04-14 10:04:21 (GMT) |
commit | fcd009cd77f95106f4522103bab9aaf86109a17d (patch) | |
tree | e7626eee7b1e05ca95d1c2ebfed27eec6cbbf4e6 | |
parent | 0ef6bb1dfadf8e83f20e2282ff4a73a466b3de87 (diff) | |
download | Qt-fcd009cd77f95106f4522103bab9aaf86109a17d.zip Qt-fcd009cd77f95106f4522103bab9aaf86109a17d.tar.gz Qt-fcd009cd77f95106f4522103bab9aaf86109a17d.tar.bz2 |
QAbstractScrollArea StyleSheet: fix drawing of border with SH_ScrollView_FrameOnlyAroundContents
- Since Qt 4.6.0, the frame is drawn by PE_Widget, but there we do not take
in account the scrollbar for the case where SH_ScrollView_FrameOnlyAroundContents
is true.
- We also reserved too much space for the border, as we included the
native border as well in the computation, so do not reserve additional
space by setting PM_ScrollView_ScrollBarSpacing to 0
Task-number: QTBUG-9821
Reviewed-by: jbache
-rw-r--r-- | src/gui/styles/qstylesheetstyle.cpp | 16 | ||||
-rw-r--r-- | src/gui/widgets/qabstractscrollarea.cpp | 2 | ||||
-rw-r--r-- | tests/auto/uiloader/baseline/css_scroll.ui | 14 |
3 files changed, 23 insertions, 9 deletions
diff --git a/src/gui/styles/qstylesheetstyle.cpp b/src/gui/styles/qstylesheetstyle.cpp index c550938..285a789 100644 --- a/src/gui/styles/qstylesheetstyle.cpp +++ b/src/gui/styles/qstylesheetstyle.cpp @@ -4242,8 +4242,15 @@ void QStyleSheetStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *op if (const QAbstractScrollArea *sa = qobject_cast<const QAbstractScrollArea *>(w)) { const QAbstractScrollAreaPrivate *sap = sa->d_func(); rule.drawBackground(p, opt->rect, sap->contentsOffset()); - if (rule.hasBorder()) - rule.drawBorder(p, rule.borderRect(opt->rect)); + if (rule.hasBorder()) { + QRect brect = rule.borderRect(opt->rect); + if (styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents, opt, w)) { + QRect r = brect.adjusted(0, 0, sa->verticalScrollBar()->isVisible() ? -sa->verticalScrollBar()->width() : 0, + sa->horizontalScrollBar()->isVisible() ? -sa->horizontalScrollBar()->height() : 0); + brect = QStyle::visualRect(opt->direction, brect, r); + } + rule.drawBorder(p, brect); + } break; } #endif @@ -4628,6 +4635,11 @@ int QStyleSheetStyle::pixelMetric(PixelMetric m, const QStyleOption *opt, const return msz.width() == -1 ? msz.height() : msz.width(); } break; + + case PM_ScrollView_ScrollBarSpacing: + if(!rule.hasNativeBorder() || rule.hasBox()) + return 0; + break; #endif // QT_NO_SCROLLBAR case PM_ProgressBarChunkWidth: diff --git a/src/gui/widgets/qabstractscrollarea.cpp b/src/gui/widgets/qabstractscrollarea.cpp index 1d496d5..73ec53e 100644 --- a/src/gui/widgets/qabstractscrollarea.cpp +++ b/src/gui/widgets/qabstractscrollarea.cpp @@ -394,7 +394,7 @@ void QAbstractScrollAreaPrivate::layoutChildren() if ((frameStyle != QFrame::NoFrame) && q->style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents, &opt, q)) { controlsRect = widgetRect; - const int extra = q->style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarSpacing); + const int extra = q->style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarSpacing, &opt, q); const QPoint cornerExtra(needv ? extra : 0, needh ? extra : 0); QRect frameRect = widgetRect; frameRect.adjust(0, 0, -cornerOffset.x() - cornerExtra.x(), -cornerOffset.y() - cornerExtra.y()); diff --git a/tests/auto/uiloader/baseline/css_scroll.ui b/tests/auto/uiloader/baseline/css_scroll.ui index 0537ab0..6ac6886 100644 --- a/tests/auto/uiloader/baseline/css_scroll.ui +++ b/tests/auto/uiloader/baseline/css_scroll.ui @@ -14,8 +14,10 @@ <string>Form</string> </property> <property name="styleSheet"> - <string notr="true">QScrollArea { background:red; } -QScrollArea .QWidget { background:transparent; } + <string notr="true">QScrollArea { background:red; + border: 5px dashed blue; } +QScrollArea .QWidget { background:transparent; + border: 5px dotted green;} QScrollArea::corner { background:yellow; } @@ -111,10 +113,10 @@ QScrollArea::corner { background:yellow; } <widget class="QWidget" name="scrollAreaWidgetContents"> <property name="geometry"> <rect> - <x>-60</x> - <y>-145</y> - <width>554</width> - <height>575</height> + <x>0</x> + <y>0</y> + <width>520</width> + <height>532</height> </rect> </property> <layout class="QGridLayout" name="gridLayout_3"> |