需求
今天跟大家分享一下如何QT程序如何在运行中实现动态布局。
假设我们主界面中有四个子窗口,我们想要按照不同的功能或者不同的状态显示不同的窗口和布局,例如下面这8种常见布局:
实现
如果想要通过基本布局实现上图展示的8种布局情况的话,最合适的就是使用QGridLayout,而且按照第8种布局方式布局完4个窗口以后,只需要通过设置特定子窗口不显示,剩余子窗口就可以自动适应变化为第1、2、3种布局,但是因为QGridLayout的特性,布局是不会自适应变化为另外几种情况的,此时就需要进行动态布局。
动态布局的步骤:
- 调用removeWidget从原有布局中删除控件
- 调用addWidget添加控件,重新进行布局
上面图片所示8种布局的实现方法:
void Widget::reLayout(int nMode){ ui->gridLayout->removeWidget(ui->testWidget); ui->gridLayout->removeWidget(ui->testWidget_2); ui->gridLayout->removeWidget(ui->testWidget_3); ui->gridLayout->removeWidget(ui->testWidget_4); switch (nMode) { case 0: ui->gridLayout->addWidget(ui->testWidget, 0, 0, 2, 2); ui->gridLayout->addWidget(ui->testWidget_2, 0, 1, 0, 0); ui->gridLayout->addWidget(ui->testWidget_3, 1, 0, 0, 0); ui->gridLayout->addWidget(ui->testWidget_4, 1, 1, 0, 0); break; case 1: ui->gridLayout->addWidget(ui->testWidget, 0, 0, 2, 1); ui->gridLayout->addWidget(ui->testWidget_2, 0, 1, 2, 1); ui->gridLayout->addWidget(ui->testWidget_3, 1, 0, 0, 0); ui->gridLayout->addWidget(ui->testWidget_4, 1, 1, 0, 0); break; case 2: ui->gridLayout->addWidget(ui->testWidget, 0, 0, 1, 2); ui->gridLayout->addWidget(ui->testWidget_2, 0, 1, 0, 0); ui->gridLayout->addWidget(ui->testWidget_3, 1, 0, 1, 2); ui->gridLayout->addWidget(ui->testWidget_4, 1, 1, 0, 0); break; case 3: ui->gridLayout->addWidget(ui->testWidget, 0, 0, 1, 1); ui->gridLayout->addWidget(ui->testWidget_2, 0, 1, 2, 1); ui->gridLayout->addWidget(ui->testWidget_3, 1, 0, 1, 1); ui->gridLayout->addWidget(ui->testWidget_4, 1, 1, 0, 0); break; case 4: ui->gridLayout->addWidget(ui->testWidget, 0, 0, 2, 1); ui->gridLayout->addWidget(ui->testWidget_2, 0, 1, 1, 1); ui->gridLayout->addWidget(ui->testWidget_3, 1, 0, 0, 0); ui->gridLayout->addWidget(ui->testWidget_4, 1, 1, 1, 1); break; case 5: ui->gridLayout->addWidget(ui->testWidget, 0, 0, 1, 2); ui->gridLayout->addWidget(ui->testWidget_2, 0, 1, 0, 0); ui->gridLayout->addWidget(ui->testWidget_3, 1, 0, 1, 1); ui->gridLayout->addWidget(ui->testWidget_4, 1, 1, 1, 1); break; case 6: ui->gridLayout->addWidget(ui->testWidget, 0, 0, 1, 1); ui->gridLayout->addWidget(ui->testWidget_2, 0, 1, 1, 1); ui->gridLayout->addWidget(ui->testWidget_3, 1, 0, 1, 2); ui->gridLayout->addWidget(ui->testWidget_4, 1, 1, 0, 0); break; case 7: ui->gridLayout->addWidget(ui->testWidget, 0, 0, 1, 1); ui->gridLayout->addWidget(ui->testWidget_2, 0, 1, 1, 1); ui->gridLayout->addWidget(ui->testWidget_3, 1, 0, 1, 1); ui->gridLayout->addWidget(ui->testWidget_4, 1, 1, 1, 1); break; }}
注意这里我为了方便从布局中删除控件,每次都将4个窗口全部添加到布局中,实际只需要添加需要的控件即可,删除的时候进行判断。
另外如果单纯想要实现这种窗口展现方式,使用QDockWidget是比较合适的。