我试图用一个Collapse/Expand按钮来创建GroupBox,希望它在Qt中有一个显而易见的功能。我已经用绘制按钮来创建QGroupBox的子类。当单击时,我的代码将对GroupBox的所有子级调用setVisible(false)
。此外,它还遍历GroupBox中的所有QLayouts,并将它们的contentMargins设置为零。但是,在折叠状态下,某些GroupBox仍然比其他GroupBox大,我不知道是什么原因导致了这种情况。
这是我到目前为止所想到的(我知道可能存在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);
}
}
3条答案
按热度按时间vc9ivgsu1#
这是由于您提到的组框中的分隔符造成的。请将它们的高度设置为零;在组框展开时不应该影响它们的行为。
anhgbhbe2#
我回到我的旧代码前一段时间,似乎我终于想出了一个合理的解决方案。完整的代码如下:
可折叠组框. h
可折叠组框. cpp
这似乎崩溃和恢复的方块完全像我所期望的。
vh0rcniy3#
我无法解释分组框的明显不可复制的高度。但您也可以这样做:
并向包含分组框的布局添加一个拉伸。当动态添加或删除小部件时,它可以很好地调整大小。