QScrollArea проблема с вертикальной прокруткой

Я прочитал несколько страниц о 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).

1

Решение

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. Обычно мы используем макеты для этого, но вы также можете сделать это вручную.

2

Другие решения


По вопросам рекламы [email protected]