Создание разборных групповых ящиков в Qt — что определяет свернутый размер?

Я пытаюсь создать групповые ящики с кнопкой «Свернуть / развернуть» с очевидной функцией в Qt. Я подкласс QGroupBox с рисует кнопку. При нажатии мой код вызывает setVisible(false) на всех детей GroupBox. Кроме того, он обходит все QLayouts в GroupBox и устанавливает их contentMargins на ноль. Тем не менее, некоторые групповые блоки все еще выходят больше, чем другие, в свернутом состоянии, и я понятия не имею, что может вызвать это.

Это то, что я придумал до сих пор (я знаю о возможном 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);
}
}

2

Решение

Это связано с тем, что вы упомянули проставки, которые находятся в окне группы. Установить их высоту на ноль; это не должно влиять на их поведение при расширении группы.

1

Другие решения

У меня нет объяснения кажущейся невоспроизводимой высоты групповой рамки. Но вы также можете просто сделать что-то вроде этого:

void CollapsibleGroupBox::onVisibilityChanged(bool state)
{
switch (state) {
case true:
m_originalMaxHeight = this->maximumHeight();
this->setMaximumHeight(this->fontMetrics().height());
break;
case false:
this->setMaximumHeight(m_originalMaxHeight);
break;
}
}

и добавьте растяжку к макету, содержащему групповое поле. Изменяет размер при динамическом добавлении или удалении виджетов.
Складная групповая коробка

0