// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include class MyScrollArea : public QAbstractScrollArea { public: MyScrollArea(QWidget *w); void setWidget(QWidget *w); protected: void scrollContentsBy(int dx, int dy) override; void resizeEvent(QResizeEvent *event) override; private: void updateWidgetPosition(); void updateArea(); QWidget *widget; }; MyScrollArea::MyScrollArea(QWidget *widget) : QAbstractScrollArea() { setWidget(widget); } void MyScrollArea::setWidget(QWidget *w) { widget = w; widget->setParent(viewport()); if (!widget->testAttribute(Qt::WA_Resized)) widget->resize(widget->sizeHint()); verticalScrollBar()->setValue(0); verticalScrollBar()->setValue(0); updateArea(); } void MyScrollArea::updateWidgetPosition() { //! [0] int hvalue = horizontalScrollBar()->value(); int vvalue = verticalScrollBar()->value(); QPoint topLeft = viewport()->rect().topLeft(); widget->move(topLeft.x() - hvalue, topLeft.y() - vvalue); //! [0] } void MyScrollArea::scrollContentsBy(int dx, int dy) { Q_UNUSED(dx); Q_UNUSED(dy); updateWidgetPosition(); } void MyScrollArea::updateArea() { //! [1] QSize areaSize = viewport()->size(); QSize widgetSize = widget->size(); verticalScrollBar()->setPageStep(areaSize.height()); horizontalScrollBar()->setPageStep(areaSize.width()); verticalScrollBar()->setRange(0, widgetSize.height() - areaSize.height()); horizontalScrollBar()->setRange(0, widgetSize.width() - areaSize.width()); updateWidgetPosition(); //! [1] } void MyScrollArea::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); updateArea(); }