2016-05-05 9 views
2

Ich versuche, GroupBoxen mit einem Collapse/Expand-Button mit einer hoffentlich offensichtlichen Funktion in Qt zu machen. Ich habe QGroupBox mit dem Zeichnen der Taste subclassiert. Wenn Sie darauf klicken, ruft mein Code setVisible(false) für alle untergeordneten Elemente der GroupBox auf. Zusätzlich geht es über alle QLayouts in der GroupBox und setzt deren ContentMargins auf Null. Einige GroupBoxen kommen jedoch im zusammengefalteten Zustand immer noch größer als andere, und ich habe keine Ahnung, was das verursachen könnte.Zusammenklappbare GroupBoxen in Qt erstellen - was bestimmt die minimierte Größe?

Dies ist, was ich mit so weit gekommen sind (ich bin mir bewusst, der möglichen nullptr Ausgabe):

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

Haben Sie versucht, das Layout zu verbergen und nichts anderes zu berühren? Dies sollte die Aufgabe machen, alle Kinder zu verstecken. –

+0

Sorgen Sie sich auch um die zusammengebrochene Höhe oder Breite? Hast du einen Screenshot? –

+0

An diesem Punkt bin ich nur von der Höhe betroffen. Das 'QLayout' scheint keine 'setVisible()' Methode zu haben. – user1134621

Antwort

1

Dies zu den Abstandhaltern gebührt Sie erwähnt, dass in der groupbox sind. Stellen Sie ihre Höhe auf Null ein; Es sollte ihr Verhalten nicht beeinflussen, wenn das Groupbox erweitert wird.

Verwandte Themen