2016-07-20 16 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

関連する問題