2015-01-11 1 views
1

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

ответ

2

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);, но это само по себе не решит вашу проблему. У вас все еще будет виджет 300px внутри области 300px, и полоса прокрутки не будет иметь места для перемещения.

Убедившись, что QWidget достаточно большой для всего, что он содержит, это то, что вы хотите сделать, QScrollArea будет адаптироваться. Обычно мы используем макеты для этого, но вы можете заставить его работать вручную.

+0

Спасибо! Кстати, есть ли способ сделать мою область модальной? Похоже, что этот метод не самый лучший: scrollArea-> setWindowModality (Qt :: WindowModal); – charqus