You do not want to set the layout on the scroll area itself. The answer you cite stems from misunderstanding this.
You need to have a widget within a scrollarea, and you pass that widget to the area using
QScrollArea::setWidget
. If all you have inside the scroll area is one widget with no children, then you don't need additional layout.You do not need to manually keep track of widgets that are owned by a layout. They'll be deleted automatically once the widget that has the layout is deleted.
The
QScrollArea
widget is not laid out within its enclosing widget.
Below is a working example of how to do it:
// https://github.com/KubaO/stackoverflown/tree/master/questions/scroll-18703286
#include <QScrollArea>
#include <QVBoxLayout>
#include <QSpinBox>
#include <QApplication>
class Window : public QWidget
{
QVBoxLayout m_layout{this};
QScrollArea m_area;
QWidget m_contents;
QVBoxLayout m_contentsLayout{&m_contents};
QSpinBox m_spinBoxes[10];
public:
Window(QWidget *parent = {}) : QWidget(parent) {
m_layout.addWidget(&m_area);
m_area.setWidget(&m_contents);
for (auto & spinbox : m_spinBoxes)
m_contentsLayout.addWidget(&spinbox);
m_contentsLayout.setSizeConstraint(QLayout::SetMinimumSize);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Window w;
w.show();
return app.exec();
}