的tree如何实现动态加载_QT程序如何在运行中实现动态布局

7cf7143f7a0be885733348a4f4a5eb3c.png

需求

今天跟大家分享一下如何QT程序如何在运行中实现动态布局。

假设我们主界面中有四个子窗口,我们想要按照不同的功能或者不同的状态显示不同的窗口和布局,例如下面这8种常见布局:

866602b7600422d9402e2746f932fdf3.png

实现

如果想要通过基本布局实现上图展示的8种布局情况的话,最合适的就是使用QGridLayout,而且按照第8种布局方式布局完4个窗口以后,只需要通过设置特定子窗口不显示,剩余子窗口就可以自动适应变化为第1、2、3种布局,但是因为QGridLayout的特性,布局是不会自适应变化为另外几种情况的,此时就需要进行动态布局。

动态布局的步骤:

  1. 调用removeWidget从原有布局中删除控件
  2. 调用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是比较合适的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值