此程序实现的是点击界面的添加界面按钮,新增加一个窗口,并实现窗口的布局,随着窗口个数的在布局中的增加,窗口大小自动缩小。创建基于QT widget Application的应用程序,选择基类QDialog,去掉Generate form前的勾,使用代码创建控件,设置所添加窗口的最大行数为5行。
代码如下:
main.cpp

#include "dialog.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog w;w.show();return a.exec();
}

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QGridLayout>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();public slots:void slot_btnClicked();
private:QGridLayout layout;QGridLayout layout1;QWidget *widget;uint16_t n;uint16_t row;
};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include <QPushButton>
#include <QMessageBox>
#include <QDebug>/*问题描述:* 动态实现新增加界面的布局*/Dialog::Dialog(QWidget *parent): QDialog(parent)
{resize(600,500);
//    setContentsMargins(2,2,2,2);//设置窗口内容到边框的距离QPushButton *addBtn = new QPushButton(tr("增加界面"),this);
//    addBtn->move(5,5);//有布局的情况下不能再设置位置
//    addBtn->setGeometry(0,0,120,40);widget = new QWidget(this);
//    widget->setGeometry(5,50,600,400);//有布局的情况下似乎没有用widget->show();//非模态对话框widget->setObjectName("Parent");widget->setStyleSheet("QWidget#Parent{background-color:green;}");layout.setSpacing(15);//设置布局中控件之间的垂直距离layout.addWidget(addBtn,0,0,1,1);layout.addWidget(widget,1,0,10,10);//为了彼此之间有参照setLayout(&layout);connect(addBtn,&QPushButton::clicked,this,&Dialog::slot_btnClicked);n = 0;row = 0;
}Dialog::~Dialog()
{}void Dialog::slot_btnClicked()//没有实现动态布局
{if(row == 5){qDebug()<<"不能再添加窗口了!";QMessageBox::information(this,tr("警告"),tr("不能再添加窗口了!"));return ;}QWidget *dlg = new QWidget(widget);
//    QDialog *dlg = new QDialog(widget);//QDialog是不被嵌入到父窗口部件的窗口,为顶级窗口dlg->show();dlg->setObjectName("child");//QWidget#Parent>dlg->setStyleSheet("QWidget#child{background-color:blue;}");
//    dlg->setStyleSheet("QDialog#child{background-color:blue;}");layout1.addWidget(dlg,row+1,(int)n%4,1,1);//栅格布局没有参照的情况下,先设置占一行一列n++;if(n%4 == 0){row++;}widget->setLayout(&layout1);
}

运行程序后,界面效果如下:

代码中含有对一些函数理解的注释,其中最关键的理解是两点:
1.QDialog为顶级窗口,没有父部件,不被嵌入到父部件中。
2.栅格布局中需要有所占行列的参考数。单一一个控件来使用栅格布局指定所占行列时,除一行一列外,无法实现期望效果,即:界面上只有一个按钮,按钮被放入栅格布局中,占3行2列,运行效果是将按钮进行了水平拉伸,几乎占据整个界面的长度。
在创建的项目的构造函数中加入如下代码:

  QPushButton *btn = new QPushButton(tr("开始"),this);btn->show();QGridLayout *layout = new QGridLayout;layout->addWidget(btn,0,0,4,3);setLayout(layout);

运行效果如下图所示:

Qt实现界面的窗口的局部动态添加并布局相关推荐

  1. 动态添加综合布局---动态添加控件及将某XML动态加入到Activity显示(续)

    前言:以前曾写过一篇关于动态生成控件的文章<动态添加控件及将某XML动态加入到Activity显示>,比较浅显,对于RelativeLayout的相关布局设置方法及相对布局与线性布局的混合 ...

  2. 为节省内存,动态添加view布局和控件

    1如果一个自定义view要在短时间被多次调用,会造成多次读取xml和findViewById,所以动态添加控件.属性 RelativeLayout: private void initView() { ...

  3. android动态添加网格布局,android – 动态网格布局

    您可以动态生成GridView. GridView将根据您的需要包含ImageView和TextView.您必须使用自定义适配器.在它的getView方法中,填充ImageView和TextView. ...

  4. android动态添加xml布局,android – 如何动态添加视图已经在xml布局中声明的RelativeLayout?...

    为第二个添加的Button LayoutParams添加规则RelativeLayout.RIGHT_OF: // first Button RelativeLayout rLayout = (Rel ...

  5. android动态居中布局,Android动态添加布局的两种方式

    释放双眼,带上耳机,听听看~! 前言 大多数时候我们布局都是用xml来布局的,但有些时候也是会用到动态布局的,尤其是在一些大项目中,动态布局更是体现的淋漓尽致. 所以今天我们就来学习一些动态加添布局的 ...

  6. android动态改变布局,Android 动态添加布局的两种方式

    前言 大多数时候我们布局都是用xml来布局的,但有些时候也是会用到动态布局的,尤其是在一些大项目中,动态布局更是体现的淋漓尽致. 所以今天我们就来学习一些动态加添布局的两种方式,分别是 动态添加xml ...

  7. Qt 之 模仿 QQ登陆界面——旋转窗口篇

    #一.简述 今天是新的一年第一篇博客,有大半个月没有更新博客了.我想是时候,打开电脑.拿起键盘.开始在我的代码之路上披荆斩棘,斩杀恶龙. 今天就继续来分享QQ登录界面的那些事.QQ登录界面的标题栏有一 ...

  8. QT之界面切换、子窗口切换主窗口、返回按钮的实现

    Qt 中我们经常会用到好几个界面,那么这几个界面之间来回切换就是一个经常出现的问题.之前我也总是被这个问题困扰,现在写一个样例程序当作一种解决方案,希望能给大家启发. 首先我定义了两个界面,一个主界面 ...

  9. Qt弹出的窗口始终位于界面最前面的方法

    一.描述 自定义窗口控件标志用于启用自定义窗口控件.调用setWindowFlags(type)函数. type参数: Qt::CustomizeWindowHint  关闭默认窗口标题提示. Qt: ...

最新文章

  1. Linux内核之时间系统
  2. secFox setting
  3. 《系统集成项目管理工程师》必背100个知识点-96我国企业信息化发展的战略要点...
  4. knex 单表查询_knex.js
  5. 控制元素的div属性
  6. T-SQL查询-逻辑查询处理
  7. 110道Python面试题(真题)
  8. 《嵌入式 – GD32开发实战指南》第7章 定时器
  9. Computer Science 领域文献检索 SCI、CPCI-S 和 EI
  10. [cf] Codeforces Round #595 (Div. 3) B12 Books Exchange
  11. matlab绿屏抠像代码,DV影像素材抠像效果研究
  12. Charset API
  13. 守望先锋显示服务器异常,守望先锋错误代码含义及解决方法
  14. 企业智能化管理固定资产的新思路
  15. Python的解包知识
  16. 第06周 预习:接口与多态
  17. 别人的18岁,恐怕会碾压你的38岁
  18. mimikatz工具使用
  19. 质量管理新理念——以员工为中心
  20. 单机游戏制作系列之二——基本框架

热门文章

  1. 【开通指南】 实时计算 Flink 全托管版本
  2. 浅析基于 Serverless 的前后端一体化框架
  3. 手机秒变IoT设备?——巧妙利用阿里云物联网平台
  4. 理解卷积神经网络的利器:9篇重要的深度学习论文(下)
  5. 阿里云SDK再升级,宣布支持C++语言
  6. 赋能工业互联网融合发展 | 北京信息化和工业化融合服务联盟平台化设计专业委员会、中国仿真学会CAE仿真专业委员会成立
  7. 华为彭松:基于C.A.F模型构建联接竞争力,创造新增长
  8. Aruba 推出Instant On 为中小型企业提供安全、高速的无线连接
  9. 雾计算精华问答 | 雾计算与云计算的区别?
  10. 无法启动此程序因为计算机丢失dtlui,电脑缺少dll文件_电脑开机总是出来DLL文件丢失,...