Qt 实现可折叠界面:隐藏控件后自动调整窗口大小
摘要:
在 Qt 开发中,常需根据用户操作动态显示或隐藏界面区域,并希望窗口高度随之自动收缩或扩展。本文通过一个简洁示例,展示如何利用 setVisible() 与 adjustSize() 配合布局系统,实现“点击按钮切换 GroupBox 显隐,窗口自动调整大小”的效果,适用于设置面板、多模式界面等场景。
关键词:
Qt、QDialog、布局管理、setVisible、adjustSize、可折叠界面、动态 UI
需求描述:
- 设计一个对话框,包含多个
QGroupBox(如 A、B、C、D),每个 GroupBox 对应一个可切换的按钮 - 当用户点击按钮关闭某个区域时,该 GroupBox 隐藏,窗口整体高度自动缩小;再次点击则恢复显示并扩展窗口
- 要求无需手动计算尺寸,完全依赖 Qt 布局系统自动响应
版本:Qt 5.14.2
点击折叠或展开代码
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
// 设置按钮为可选中状态
ui->pushButton_A->setCheckable(true);
ui->pushButton_B->setCheckable(true);
ui->pushButton_C->setCheckable(true);
ui->pushButton_D->setCheckable(true);
// 默认全部展开
ui->pushButton_A->setChecked(true);
ui->pushButton_B->setChecked(true);
ui->pushButton_C->setChecked(true);
ui->pushButton_D->setChecked(true);
// 设置最小高度
ui->groupBox_A->setMinimumHeight(150);
ui->groupBox_B->setMinimumHeight(150);
ui->groupBox_C->setMinimumHeight(150);
ui->groupBox_D->setMinimumHeight(150);
// 连接信号槽
connect(ui->pushButton_A, &QPushButton::toggled, this, &Dialog::hideWidgetA);
connect(ui->pushButton_B, &QPushButton::toggled, this, &Dialog::hideWidgetB);
connect(ui->pushButton_C, &QPushButton::toggled, this, &Dialog::hideWidgetC);
connect(ui->pushButton_D, &QPushButton::toggled, this, &Dialog::hideWidgetD);
// 启用自动调整大小能力
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
adjustSize();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::hideWidgetA(bool checked)
{
ui->groupBox_A->setVisible(checked);
adjustSize();
}
void Dialog::hideWidgetB(bool checked)
{
ui->groupBox_B->setVisible(checked);
adjustSize();
}
void Dialog::hideWidgetC(bool checked)
{
ui->groupBox_C->setVisible(checked);
adjustSize();
}
void Dialog::hideWidgetD(bool checked)
{
ui->groupBox_D->setVisible(checked);
adjustSize();
}
代码说明:
-
布局前提:
在 Qt Designer 中,必须将所有groupBox放入一个网格布局(Grid Layout) ,且该布局应用于整个对话框。这是自动调整的基础。布局如下:
-
setVisible():
控制QGroupBox的显隐。当设为false时,布局系统会将其占用空间回收。 -
adjustSize():
关键调用! 通知顶层窗口重新计算其“理想大小”(基于子控件当前可见状态),并自动 resize。若不调用,窗口尺寸不会变化。 -
setSizePolicy(..., QSizePolicy::Minimum):
告诉窗口:“你的高度应尽可能小”,避免因默认 size policy 导致无法收缩。 -
按钮设为
checkable:
利用toggled(bool)信号直接传递目标可见状态,简化逻辑。
效果展示:

参考文献:
- Qt自带示例「Extension Example」


浙公网安备 33010602011771号