diff options
-rw-r--r-- | src/widgets/widgets/qabstractscrollarea.cpp | 2 | ||||
-rw-r--r-- | tests/auto/widgets/styles/qstyle/tst_qstyle.cpp | 39 |
2 files changed, 40 insertions, 1 deletions
diff --git a/src/widgets/widgets/qabstractscrollarea.cpp b/src/widgets/widgets/qabstractscrollarea.cpp index faa6933e75..348334d517 100644 --- a/src/widgets/widgets/qabstractscrollarea.cpp +++ b/src/widgets/widgets/qabstractscrollarea.cpp @@ -407,7 +407,7 @@ void QAbstractScrollAreaPrivate::layoutChildren() if ((frameStyle != QFrame::NoFrame) && q->style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents, &opt, q)) { controlsRect = widgetRect; - const int extra = scrollOverlap; + const int extra = scrollOverlap + 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/widgets/styles/qstyle/tst_qstyle.cpp b/tests/auto/widgets/styles/qstyle/tst_qstyle.cpp index 2fb0ffe911..119ea33fc3 100644 --- a/tests/auto/widgets/styles/qstyle/tst_qstyle.cpp +++ b/tests/auto/widgets/styles/qstyle/tst_qstyle.cpp @@ -72,6 +72,7 @@ #include <qradiobutton.h> #include <qlineedit.h> #include <qmdiarea.h> +#include <qscrollarea.h> #include <QCleanlooksStyle> @@ -148,6 +149,7 @@ private slots: #endif void defaultFont(); void testDrawingShortcuts(); + void testFrameOnlyAroundContents(); private: void lineUpLayoutTest(QStyle *); QWidget *testWidget; @@ -763,6 +765,7 @@ public: int alignment; }; + void tst_QStyle::testDrawingShortcuts() { { @@ -796,5 +799,41 @@ void tst_QStyle::testDrawingShortcuts() } } +#define SCROLLBAR_SPACING 33 + +class FrameTestStyle : public QWindowsStyle { + int styleHint(StyleHint hint, const QStyleOption *opt, const QWidget *widget, QStyleHintReturn *returnData) const { + if (hint == QStyle::SH_ScrollView_FrameOnlyAroundContents) + return 1; + return QWindowsStyle ::styleHint(hint, opt, widget, returnData); + } + + int pixelMetric(PixelMetric pm, const QStyleOption *option, const QWidget *widget) const { + if (pm == QStyle::PM_ScrollView_ScrollBarSpacing) + return SCROLLBAR_SPACING; + return QWindowsStyle ::pixelMetric(pm, option ,widget); + } +}; + +void tst_QStyle::testFrameOnlyAroundContents() +{ + QScrollArea area; + area.setGeometry(0, 0, 200, 200); + QWindowsStyle winStyle; + FrameTestStyle frameStyle; + QWidget *widget = new QWidget(&area); + widget->setGeometry(0, 0, 400, 400); + area.setStyle(&winStyle); + area.verticalScrollBar()->setStyle(&winStyle); + area.setWidget(widget); + area.setVisible(true); + int viewPortWidth = area.viewport()->width(); + area.verticalScrollBar()->setStyle(&frameStyle); + area.setStyle(&frameStyle); + // Test that we reserve space for scrollbar spacing + QVERIFY(viewPortWidth == area.viewport()->width() + SCROLLBAR_SPACING); +} + + QTEST_MAIN(tst_QStyle) #include "tst_qstyle.moc" |