2016-07-20 8 views
1

Ich habe ein Dialogfeld mit einer QScrollArea, um eine beliebige Anzahl von Checkboxen anzuzeigen. Wie kann ich die Breite des Dialogfelds anpassen, sodass die QScrollArea keine horizontale Bildlaufleiste hat (wenn der Inhalt nicht extrem breit ist).Wie kann ich die Fenstergröße eines QDialogs an seinen Inhalt anpassen?

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); 
} 

Antwort

0

Das Problem ist der Scroll-Bereich begrenzt seine Größe, um verfügbaren Speicherplatz standardmäßig zu nehmen; es ist nicht Nachfrage Platz aus dem Layout. Sie müssen es ausdrücklich sagen, um dieses Verhalten zu ändern.

Auschecken QAbstractScrollArea::SizeAdjustPolicy. Sie suchen wahrscheinlich für AdjustToContentsOnFirstShow, etwa so:

pScrollAreaTheCheckboxes->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContentsOnFirstShow); 

Leider kann man nicht anders festgelegten Richtlinien für horizontale und vertikale Aspekte anpassen, wenn dies ist, was Sie nach. Eine vernünftige Verwendung von und Layouteinstellungen (z. B. setStretch()) kann dies beheben.

Qt4
Als Abhilfe für Qt4, überprüfen Sie die sizeHint() des Ansichtsfenster und legen Sie die Mindestgröße des Scroll-Bereich zu dem.

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

Tun Sie dies, nachdem Sie alle Ihre Kontrollkästchen initialisiert haben.

+0

Gute Antwort. Leider muss ich Qt 4.8 benutzen. Da es nur ein Dialog ist, muss ich die Breite nur einmal auf etwas sinnvolles einstellen, wenn es geöffnet wird. Gibt es eine Möglichkeit, den Bildlaufbereich direkt nach der benötigten Breite zu fragen? Vielleicht kann ich die Checkboxen nach ihrer Breite fragen und das Maximum nehmen? – Fabian

+0

@Fabian Siehe meine Bearbeitung. –

+0

Ich habe die Zeile zum obigen Beispiel unter 'pScrollAreaTheCheckboxes-> setWidget (pFrameCheckboxes);' hinzugefügt, aber es ändert nichts. Funktioniert es auf Ihrer Maschine? – Fabian

Verwandte Themen