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();
}

代码说明:

  1. 布局前提
    在 Qt Designer 中,必须将所有 groupBox 放入一个网格布局(Grid Layout) ,且该布局应用于整个对话框。这是自动调整的基础。布局如下:image1

  2. setVisible()
    控制 QGroupBox 的显隐。当设为 false 时,布局系统会将其占用空间回收。

  3. adjustSize()
    关键调用! 通知顶层窗口重新计算其“理想大小”(基于子控件当前可见状态),并自动 resize。若不调用,窗口尺寸不会变化。

  4. setSizePolicy(..., QSizePolicy::Minimum)
    告诉窗口:“你的高度应尽可能小”,避免因默认 size policy 导致无法收缩。

  5. 按钮设为 checkable
    利用 toggled(bool) 信号直接传递目标可见状态,简化逻辑。

效果展示:

001


参考文献:

  • Qt自带示例「Extension Example」
    image

posted @ 2026-04-16 15:35  薄暮知秋  阅读(8)  评论(0)    收藏  举报
/*https://www.cnblogs.com/lingr7/p/15651906.html*/ /*自动显示目录导航*/