最近在工作时,被要求,需要将布局中的某些部件隐藏后,但不能影响原来的布局。
现在记录解决方案!
一、水平布局(垂直布局一样)
ui中的布局
效果:

按钮可以任意隐藏,都不影响其中布局。
隐藏代码:
cpp
ui->pushButton_1->hide(); // 需要使用hide()
QSizePolicy retain = ui->pushButton_1->sizePolicy(); // 获取控件的大小调整策略
retain.setRetainSizeWhenHidden(true); // 设置控件被隐藏时,任然保持在布局中的位置大小
ui->pushButton_1->setSizePolicy(retain); // 重新设置大小策略
需要使用到**hide()**函数。
显示代码:
cpp
ui->pushButton_1->setHidden(false);
// 也可以 ui->pushButton_1->show();
这种是在ui布局中的

二、网格布局 GridLayout (其他布局类似)
代码中自定义控件的布局
实现效果:

将第一个,第三个,第七个按钮给隐藏掉了,但是并不影原来的布局。
布局代码:
cpp
QGridLayout *gLayout = new QGridLayout(this);
QList<QPushButton *> pList;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
QPushButton *btn = new QPushButton(this);
btn->setText("我是按钮");
pList.append(btn); // 添加到链表,用于隐藏部件按钮
btn->hide(); // 1.需要先隐藏
gLayout->addWidget(btn, i, j); // 2.再添加到布局
}
}
// 上面被隐藏了,这里显示出来
for (QPushButton *btn : pList) {
btn->setHidden(false);
}
this->setLayout(gLayout);
注意,需要先隐藏控件后,再添加到布局管理器中!
为什么需要这样呢?某些场景下不这样操作,无法达到最终效果!

隐藏代码:
cpp
pList[0]->hide(); // 需要使用hide()
QSizePolicy retain = pList[0]->sizePolicy();
retain.setRetainSizeWhenHidden(true);
pList[0]->setSizePolicy(retain);
// ... 其他按钮隐藏类似,修改索引即可
需要恢复显示,可以使用 setHidden 函数或者 show 函数。


完!