2016-05-05 17 views
2

Qtでうまくいけば明らかな機能を持つCollapse/ExpandボタンでGroupBoxを作成しようとしています。私はボタンを描くとQGroupBoxをサブクラス化しました。クリックすると、私のコードはGroupBoxのすべての子にsetVisible(false)を呼び出します。さらに、GroupBox内のすべてのQLayoutsを通過し、contentMarginsをゼロに設定します。しかし、いくつかのGroupBoxはまだ折りたたまれた状態で他のものよりも大きく出てきます。折りたたみ可能なグループボックスをQtで作成する - 折りたたみサイズを決定するものは何ですか?

これは(私が可能nullptr問題を認識だ)私は今のところ出ているものです:

void CollapsibleGroupBox::onVisibilityChanged() 
{ 
    CollapseExpandButton::State s; 

    s = m_clExpButton->state(); 

    QLayout *master = this->layout(); 
    QList<QObject *> children = this->children(); 

    switch (s) { 
    case CollapseExpandButton::State::COLLAPSED: 
    for (QObject *o : children) { 
     QWidget *w = qobject_cast<QWidget *>(o); 
     if (w != nullptr) { 
     if (w != m_clExpButton) 
      w->setVisible(false); 

     continue; 
     } 

     if (o == master) { 
     m_layoutMargins.clear(); 
     collapseLayout(master); 
     } 
    } 
    break; 
    case CollapseExpandButton::State::EXPANDED: 
    for (QObject *o : children) { 
     QWidget *w = qobject_cast<QWidget *>(o); 
     if (w != nullptr) { 
     w->setVisible(true); 

     continue; 
     } 

     if (o == master) 
     expandLayout(master); 

    } 
    break; 
    } 
} 


void CollapsibleGroupBox::collapseLayout(QLayout *layout) 
{ 
    for (QObject *o : layout->children()) { 
    QLayout *l= qobject_cast<QLayout *>(o); 
    if (l == nullptr) 
     continue; 

    collapseLayout(l); 
    } 
    if (m_layoutMargins.contains(layout)) 
    return; 

    QMargins m = layout->contentsMargins(); 
    m_layoutMargins[layout] = m; 
    layout->setContentsMargins(0, 0, 0, 0); 
} 

void CollapsibleGroupBox::expandLayout(QLayout *layout) 
{ 
    for (QObject *o : layout->children()) { 
    QLayout *l = qobject_cast<QLayout *>(o); 
    if (l == nullptr) 
     continue; 

    if (m_layoutMargins.contains(l)) 
     expandLayout(l); 
    } 
    if (m_layoutMargins.contains(layout)) { 
    QMargins m = m_layoutMargins[layout]; 
    layout->setContentsMargins(m); 
    } 
} 
+0

レイアウトを隠して他に触れてみましたか?これはすべての子供を隠す仕事をするべきです。 –

+0

また、折りたたんだ高さや幅について心配していますか?あなたはスクリーンショットを持っていますか? –

+0

この時点で私は高さのみを心配しています。 'QLayout'は' setVisible() 'メソッドを持たないようです。異なるサイズの 折りたたみグループボックス:https://imgur.com/NqqvJwq ピーク:のhttp:// imgur http://imgur.com/tg4jSAw デザイナー HVLに示すこれらのウィジェットのスクリーンショットについては – user1134621

答えて

1

これは、グループボックス内にある、あなたが言及したスペーサーによるものです。高さをゼロに設定します。グループボックスが展開されたときの動作に影響を与えるべきではありません。

関連する問題