Я прочитал несколько страниц о QScrollArea и не смог решить свою проблему. У меня есть следующий код:
QDialog *window = new QDialog;
window->resize(300, 300);
for(int i = 0; i < 50; ++i)
{
QLabel *label = new QLabel(window);
label->move(10, i * 15);
label->setText("Text");
}
QScrollArea *area = new QScrollArea;
area->setWidget(window);
area->show();
Кажется, что вертикальная прокрутка из QScrollArea не появляется. Я не могу использовать QVBoxLayout, потому что на моем QDialog у меня нет только QLabels, выровненных по вертикали (это просто упрощенная версия моего QDialog).
QScrollArea не получит полосы прокрутки, если QWidget внутри не вырастет. Простое перемещение некоторых QLabels за границы не приводит к росту родительского QWidget, особенно без QLayout.
Но если вы измените их размер вручную, чтобы QWidget был больше, чем QScrollAreay, вы получите полосы прокрутки, как и ожидалось:
QDialog *window = new QDialog;
window->resize(300, 600); //< 600px high widget
for(int i = 0; i < 50; ++i)
{
QLabel *label = new QLabel(window);
label->move(10, i * 15);
label->setText("Text");
}
QScrollArea *area = new QScrollArea;
area->setWidget(window);
area->resize(300,300); //< Inside a 300px high scrollarea, expect scrollbars!
area->show();
Обратите внимание, что теперь у вас будет и то и другое полосы прокрутки, потому что вертикальная полоса прокрутки означает, что больше нет места для нашей ширины 300 пикселей. Вы можете принудительно скрыть горизонтальную полосу прокрутки с помощью area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Вы также можете всегда заставить вертикальную полосу прокрутки появляться с area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
, но это само по себе не решит вашу проблему. У вас все еще будет виджет 300 пикселей внутри области 300 пикселей, а на полосе прокрутки не будет места для перемещения.
Убедившись, что QWidget достаточно большой для всего, что в нем содержится, вы захотите сделать QScrollArea. Обычно мы используем макеты для этого, но вы также можете сделать это вручную.