2016-07-20 6 views
1

У меня есть диалоговое окно с QScrollArea для отображения произвольного количества флажков. Как сделать диалоговое окно отрегулировать его ширину так, чтобы в QScrollArea не была горизонтальная полоса прокрутки (если контент не очень широкий).Как настроить размер окна QDialog для его содержимого?

std::vector<std::string> vec_strCheckboxLabel; 
vec_strCheckboxLabel.push_back("Checkbox 1"); 
vec_strCheckboxLabel.push_back("Checkbox 2"); 
vec_strCheckboxLabel.push_back("Checkbox 3 is really long and causes a horizontal scroll bar to appear"); 
vec_strCheckboxLabel.push_back("Checkbox 4"); 
vec_strCheckboxLabel.push_back("Checkbox 5"); 

m_pWidget = new QDialog; 
m_pWidget->setWindowTitle("My Dialog"); 
m_pWidget->setWindowModality(Qt::ApplicationModal); 
m_pWidget->setMinimumWidth(400); 
QVBoxLayout * pWidgetLayout = new QVBoxLayout(m_pWidget); 
QLabel * pLabel = new QLabel("Hello"); 
pWidgetLayout->addWidget(pLabel); 

QHBoxLayout * pTopButtonsLayout = new QHBoxLayout(m_pWidget); 
pWidgetLayout->addLayout(pTopButtonsLayout); 

QPushButton * pButton; 

pButton = new QPushButton("Select all", m_pWidget); 
connect(pButton, SIGNAL(clicked()), this, SLOT(slotSelectAll())); 
pTopButtonsLayout->addWidget(pButton); 

pButton = new QPushButton("Select none", m_pWidget); 
connect(pButton, SIGNAL(clicked()), this, SLOT(slotSelectNone())); 
pTopButtonsLayout->addWidget(pButton); 

// the checkboxes in a scroll area 
{ 
    QFrame * pFrameCheckboxes = new QFrame(m_pWidget); 
    QVBoxLayout * pCheckboxesLayout = new QVBoxLayout(pFrameCheckboxes); 
    // this frame takes all available space in the QDialog 
    pFrameCheckboxes->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); 

    for (unsigned int i = 0, iEnd = vec_strCheckboxLabel.size(); i != iEnd; ++i) 
    { 
     QCheckBox * poCheckBox = new QCheckBox(vec_strCheckboxLabel[i].c_str()); 
     pCheckboxesLayout->addWidget(poCheckBox); 
    } 

    // put into scroll area 
    QScrollArea * pScrollAreaTheCheckboxes = new QScrollArea(m_pWidget); 
    pWidgetLayout->addWidget(pScrollAreaTheCheckboxes); 
    pScrollAreaTheCheckboxes->setWidget(pFrameCheckboxes); 
} 

ответ

0

Проблема заключается в том, что область прокрутки ограничивает ее размер, чтобы освободить место по умолчанию; это не спрос пространство от макета. Вы должны явно сказать, чтобы изменить это поведение.

Отъезд QAbstractScrollArea::SizeAdjustPolicy. Вы, вероятно, ищет AdjustToContentsOnFirstShow, например, так:

pScrollAreaTheCheckboxes->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContentsOnFirstShow); 

К сожалению, вы не можете установить разные настроить политику для горизонтальных и вертикальных сторон, если это то, что вы после этого. Разумное использование QSizePolicy и настройки макета (например, setStretch()) могут исправить это.

Qt4
Как обходной путь для Qt4, проверьте окна просмотра sizeHint() и установить минимальный размер области прокрутки на это.

pScrollAreaTheCheckboxes->setMinimumSize(pScrollAreaTheCheckboxes->viewport()->sizeHint()); 

Сделайте это после того, как вы инициализировали все свои флажки.

+0

Хороший ответ. К сожалению, я должен использовать Qt 4.8. Поскольку это всего лишь диалог, мне просто нужно установить ширину в нечто разумное, когда оно открывается. Есть ли способ напрямую спросить область прокрутки, какую ширину она требует? Может быть, я могу задать флажки об их ширине и взять максимум? – Fabian

+0

@Fabian См. Мое редактирование. –

+0

Я добавил строку в пример выше, под 'pScrollAreaTheCheckboxes-> setWidget (pFrameCheckboxes);', но это ничего не меняет. Он работает на вашей машине? – Fabian