qt——常用的布局方法
窗体上的所有的控件必须有一个合适的尺寸和位置。Qt提供了一些类负责排列窗体上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QStackLayout。(布局管理类)这些类简单易用,无论在代码中还是用Qt Designer开发程序都能用到。

1) 布局类简介
QHBoxLayout:水平布局
QVBoxLayout:垂直布局
QGridLayout: 表格布局
QGridLayout::addWidget()语法
layout->addWidget(widget, row, column, rowSpan, columnSpan);
参数widget:为插入到这个布局的子控件;
参数(row,column)为控件占据的左上角单元格位置;
参数rowSpan是控件占据的行数,
参数colunmSpan是控件占据的列的个数。
(rowSpan和colunmSpan默认值为1)
Stacked Layouts:分组布局
QStackedLayout类把子控件进行分组或者分页,一次只显示一组或者一页,隐藏其他组或者页上的控件。
使用这些Qt布局管理类的另一个原因是,在程序、系统改变字体,语言或者在不同的平台上运行时,布局管理器能够自动调整窗体里所有控件的大小和尺寸。
其他可进行布局管理的类:这些类的共同特点是提供了更加灵活的布局管理,在一定程度上用户能够控制窗体内控件的大小。
QSplitter,QScrollArea,QMainWindow,QWorkspace(对多文档的支持)
2) 布局管理中结合控件的sizePolicy属性,进行调整
结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。
控件的sizePolicy说明控件在布局管理中的缩放方式。Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。一个QSizePolicy的所有变量对水平方向和垂直方向都适用。下面列举了一些最长用的值:
A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。
B. Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以
放大。
C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小
的允许尺寸。
D. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小
E. Expandint:控件可以自行增大或者缩小
注:sizeHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值)
3) 布局管理的三种方式
Qt中有三种方式对窗体上的控件进行布局管理:绝对位置定位(absolute positioning),手工布局(manual layout),布局管理器(layout managers)
3-1 绝对位置定位(控件布局是固定位置,没有自适应功能)
例子:
QWidget *pWidget = new QWidget;
QLabel label(pWidget);
label.setText(QObject::tr("姓名:"));
label.setGeometry(10,10,20,20);
QLineEdit namedLineEdit("小明",pWidget);
namedLineEdit.setGeometry(35,10,50,20);
QPushButton *btn = new QPushButton(QObject::tr("关闭"),pWidget);
btn->setGeometry(90,10,40,20);
图例:

3-2 手工布局
给出控件的绝对位置,但是他们的尺寸根据窗口的大小确定,可以通过重写窗体控件的resizeEvent()实现对子控件的大小设置。
3-3 布局管理器
例子1:运用QHBoxLayout、QVBoxLayout、QGridLayout布局

//leftLayout布局设置(表格布局)
/* QGridLayout: 二维的单元格*/
QGridLayout *leftLayout = new QGridLayout;
leftLayout->addWidget(&namedLabel, 0, 0); //起始(0行,0列),尺寸(1行,1列)
leftLayout->addWidget(&namedLineEdit, 0, 1);
leftLayout->addWidget(&lookInLabel, 1, 0);
leftLayout->addWidget(&lookInLineEdit, 1, 1);
leftLayout->addWidget(&subDirCheckBox, 2, 0, 1, 2);//起始(3行,0列),尺寸(1行,2列)
leftLayout->addWidget(&tableWidget, 3, 0, 1, 2);
leftLayout->addWidget(&messageLabel, 4, 0, 1, 2);
//rightLayout布局设置(垂直布局)
QVBoxLayout *rightLayout = new QVBoxLayout;
rightLayout->addWidget(&findButton);
rightLayout->addWidget(&stopButton);
rightLayout->addWidget(&closeButton);
//布局管理器在指定的位置留出一块空间(Qt Designer中,可以加入一个spacer实现这一功能)
rightLayout->addStretch();
rightLayout->addWidget(&helpButton);
//mainLayout布局设置(水平布局)
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
pWidget->setLayout(mainLayout);//设置Widget窗口控件的布局风格
pWidget->setWindowTitle(QObject::tr("查找文件及文件夹"));
例子1图列:

3-4 例子2:运用Stacked Layouts:分组布局
例子:
//创建QWidget类的一个对象pWidget
QWidget *pWidget = new QWidget;
//创建一个布局管理器类 layout
QHBoxLayout *manLayout = new QHBoxLayout;
//左边的列表控件
QListWidget *listWidget = new QListWidget(pWidget);
listWidget->addItem(QObject::tr("外观设置"));
listWidget->addItem(QObject::tr("网页浏览"));
...
//右边的分页控件
QWidget *page1 = new QWidget(pWidget);
<…page1上增加控件>
QWidget *page2 = new QWidget(pWidget);
<…page2上增加控件>
<设置布局管理>
QVBoxLayout *leftLayout = new QVBoxLayout;
leftLayout->addWidget(listWidget);
....
//右边分页布局(两页窗口)
QStackedLayout *stackedLayout = new QStackedLayout;
stackedLayout->addWidget(page1);
stackedLayout->addWidget(page2);
//通过调用QWidget::setLayout()函数,将layout布局管理器类添加到窗口部件对象pWidget中
manLayout->addLayout(leftLayout);
manLayout->addLayout(stackedLayout);
pWidget->setLayout(manLayout);
listWidget->setCurrentRow(0);
//关联:列表与分组布局
QObject::connect(listWidget, SIGNAL(currentRowChanged(int)),
stackedLayout, SLOT(setCurrentIndex(int)));
pWidget->show();
图例:


qt——常用的布局方法的更多相关文章
- Qt中的布局浅析与弹簧的使用,以及Qt居中的两种方法
1. 布局 为什么要布局: 布局之后窗口的排列是有序的 布局之后窗口的大小发生变化, 控件的大小也会对应变化 如果不对控件布局, 窗口显示出来之后有些控件的看不到的 布局是可以嵌套使用 常用的布局方式 ...
- flex 布局 初次接触这个好使又不是特别好用的布局方法
刚开始学前端的童鞋们应该也是一样先学习的table然后再学习了盒子模型,感觉终于学会了简单的网页布局,使用各种display,float,position绞尽脑汁给页面布局成自己想要的页面样式,然而, ...
- 解析Qt中QThread使用方法
本文讲述的是在Qt中QThread使用方法,QThread似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用QThread,随便用goog ...
- 第二章 Qt常用工具的介绍
第二章 Qt常用工具的介绍 (1)No.1 qmake 相信编写过Makefile的开发人员,随着工程中源码的级数递增和以类型.功能.模块组织源码的子目录的增多,都不愿意重复机械地手工编写这个工程管理 ...
- Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)
一.Qt中事件处理的方式 1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...
- Qt常用控件
Qt常用控件 QWidget与QFrame QWidget所有图形控件的基类 QFrame与QWidget的区别 QFrame是基本控件的基类, QWidget是QFrame的基类. 因此QFrame ...
- QMdiArea及QMdiSubWindow实现父子窗口及布局方法
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QMdiArea及QMdiSubWindow实现父子窗口及布局方法 本文地址:http ...
- WebView全面学习(一)--常用类和方法
WebView全面学习(一)--常用类和方法 WebView本质上是一个View,他基于webkit引擎来展示web页面 在Android不同的版本webkit内核有所区别,从Android版本上看, ...
- 常用前端布局,CSS技巧介绍
常用前端布局,CSS技巧介绍 对前端常用布局的整理总结,并对其性能优劣,兼容等情况进行介绍 css常用技巧之可变大小正方形的绘制 1:若通过设置width为百分比的方式,则高度不能通过百分比来控制. ...
随机推荐
- Apache Kafka 1.0.0正式发布!
千呼万唤始出来,经过7年的发展与完善,Apache Kafka 1.0.0正式发布!在笔者看来,比起1.0.0引入的新功能,此版本最大的意义在于标识Kafka各种组件功能的稳定性.不过我们还是来看下1 ...
- java接口定义的静态方法和默认如何在类实现的时候使用
在 JDK1.8,允许我们给接口添加两种非抽象的方法实现: 1.默认方法,添加 default 修饰即可: 2.静态方法,使用 static 修饰:示例如下: 这样可以实现接口的增强,那我们在类实现接 ...
- 【Java并发编程五】信号量
一.概述 技术信号量用来控制能够同时访问某特定资源的活动的数量,或者同时执行某一给定操作的数据.计数信号量可以用来实现资源池或者给一个容器限定边界. 信号量维护了一个许可集,许可的初始量通过构造函数传 ...
- iOS 沙盒目录结构及正确使用
前言:处于安全考虑,iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件(也有例外,比如在用户授权情况下访问通讯录,相册等),这个规则展示了iOS系统的封闭性.在开发中常常需要数据存储的功 ...
- ajax二级联动代码实例
//二级联动 $(function () { var _in_progress = false; function check_in_progress() { if (_in_progress == ...
- Android井字游戏(二)游戏界面
图片与代码可见书配套官网下载 1 棋盘 1.1 先将游戏界面所需的图片放于“drawable-xxhdpi”文件夹中,后缀xxhdpi表示超高密度. 然后将图片封装到drawable中一个名为til ...
- 【前端系列】移动前端开发之viewport的深入理解
在页面上没有设置width所以样式显示有问题,本来选择的响应式模式的320*410结果看到页面的实际宽度确实980px. 本文转载自: 在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的 ...
- 【css系列】创建网页加载进度条
一.最简单或者明显的方式是使用定时器 1.在网页中加入布局覆盖真实网页内容 2.使用定时器确定加载所用时间的长短,其实并不是真正的加载进度实现 <!DOCTYPE html> <ht ...
- 0R的电阻以及NC的意义
0欧电阻的作用: 0欧的电阻大概有以下几个功能:①做为跳线使用.这样既美观,安装也方便.②在数字和模拟等混合电路中,往往要求两个地分开,并且单点连接.我们可以用一个0欧的电阻来连接这两个地,而不是直接 ...
- SharpGL学习笔记(十) 常见的光源类型,创建光源
在OpenGL中,使用光源的特性组合,如颜色,位置,方向等等,可以创建多种不同类型的灯光. 常见的几种灯光类型有: 定向光源(directonal) 定位光源(positional) 衰减光源 聚光灯 ...