Qt知识回顾(三)——布局管理

   对于一个完善的软件,布局管理是必不可少的。Qt主要提供了QLayout类及其子类来作为布局管理器,它们可以实现常用的布局管理功能,QLayout及其子类的关系如下:
在这里插入图片描述

布局管理系统

   Qt的布局管理系统提供了强大的机制来自动排列窗口中的所有部件,确保它们有效地使用空间。所有QWidget的子类的实例(对象)都可以使用布局管理器管理位于他们之中的子部件,QWidget::setLayout()函数可以在一个部件上应用布局管理器。一旦一个部件上设置了布局管理器,那么它会完成以下几种任务:
   ----定位子部件;
   ----感知窗口默认大小;
   ----感知窗口最小大小;
   ----窗口大小变化时进行处理;
   ----当内容改变时自动更新:当字体大小、文本或子部件的其他内容随之变化;隐藏或显示子部件;移除一个子部件;

布局管理器

  QLayout类是布局管理器的基类,继承自QObject和QLayoutItem类,QLayoutItem类提供了一个供QLayout操作的抽象项目。QLayoutItem都是在设计自己的布局管理器时才使用的,一般只需要使用QLayout的几个子类即可,它们分别是QBoxLayout(基本布局管理器)、QGridLayout(栅格布局管理器)、QFormLayout(窗口布局管理器)和QStackedLayout(栈布局管理器)。

1.基本布局管理器(QBoxLayout)
   基本布局管理器QBoxLayout类可以使子部件在水平方向或垂直方向排成一列,它将所有的空间分成一行盒子,然后将每个部件放入一个盒子中。它有两个子类QHBoxLayout水平布局管理器和QVBoxLayout垂直布局管理器。

布局管理器常用属性说明

属性说明
layoutName现在所使用的布局管理器的名称
layoutLeftMagin设置布局管理器到设置布局管理器到界面左边界的距离
layoutTopMagin设置布局管理器到设置布局管理器到界面上边界的距离
layoutRightMagin设置布局管理器到设置布局管理器到界面右边界的距离
layoutBottomMagin设置布局管理器到设置布局管理器到界面下边界的距离
layoutSpacing布局管理器中各个子部件间的距离
layoutStretch伸缩因子
layoutSizeConstraint设置大小约束条件

使用样例:
  QHBoxLayout * layout = new QHBoxLayout;//新建水平布局管理器
  layout->addWidget(ui->fontComboBox);//向布局管理器中添加部件
  layout->addWidget(ui->textEdit);
  layout->setSpacing(50);//设置部件间的间隔
  layout->setContentsMargins(0,0,50,100);//设置布局管理器到边界的距离,四个参数顺序是左,上,右,下
  setLayout(layout); //将这个布局设置为窗口类的布局
2.栅格布局管理器(QGridLayout)
  栅格布局管理器QGridLayout类使部件在网格中进行布局,他将所有的空间分割成一些行和列,行和列的交叉处形成了单元格,然后将部件放入一个确定的单元格中。

使用样例:
  QGridLayout *layout = new QGridLayout;
  layout->addWidget(ui->fontComboBox,0,0,1,2);//添加部件,从第0行0列开始,占据1行2列
  layout->addWidget(ui->pushButton,0,2,1,1);//添加部件,从第0行行0列开始,占据1行1列
  layout->addWidget(ui->textEdit,1,0,1,3);//添加部件,从第1行0列开始,占据1行3列
  setLayout(layout);

3.窗口布局管理器(QFormLayout)
  窗体布局管理器QFormLayout类用来管理表单的输入部件以及与它们相关的标签。窗体布局管理器将它的子部件分为两列:左边是一些标签,右边是一些输入部件,比如行编辑器或者数字选择框。窗体布局管理器为设计表单窗口提供了多方面的支持。如果不是为了设计这样的表单,一般会使用栅格布局管理器。

举个例子说明窗口布局管理器的的独特性:
  在设计模式中,从部件栏中找到Form Layout便将其拖入到界面上,然后双击或者在它上面右击并在弹出级联菜单中选择"添加窗体布局行"。在弹出的"添加表单布局行"对话框中填入标签文字"姓名(&N):",这样下面便自动填写了"标签名称"、“字符类型”、"字段名称"等,并且设置了伙伴关系(表示设置快捷键Alt+N)。在运行后可以通过的快捷键Alt+N,光标自动跳转到标签后面对应的行编辑器中。

4.栈布局管理器(QStackedLayout)
  QStackedLayout类提供了多页面切换的布局,一次只能看到一个界面。QStackedLayout可用于创建类似于QTabWidget提供的用户界面。也有建立在QStackedLayout之上的便利类QStackedWidget。其用法与QStackedWidget用法相同。

  QStackedLayout特点:所有组件垂直于屏幕的方向被管理;被管理的组件都能够被显示在屏幕上,但每次只有一个组件被显示在屏幕上;只有最顶层的组件会在屏幕上显示;能够自由切换需要显示的组件;被管理的所有组件的大小是一样的,充满父组件的显示区;不能直接嵌套其他布局管理器,但是可以间接。

QStackedLayout使用:
  int addWidget(QWidget* widget);//功能:将widget组件添加到栈式布局管理器的尾部,并返回widget所在位置的索引。(注意:如果在调用该函数前QStackedLayout是空的,那么该widget就是当前被显示的widget。)
  QWidget* currentWidget();//功能:返回当前显示的组件对象,如果QStackedLayout是空的话就返回0
  void setCurrentIndex(int index);//它是一个公有槽函数,可以通过index参数设置对应索引位置的组件变得可见
  int currentIndex();//返回当前正被显示的组件的索引值

设置部件大小

  凡是继承自QWidget的类都有大小提示(sizeHint)和最小大小提示(minimumSizeHint)这两个属性,其中,sizeHint属性保存了部件的建议大小,对于不同的部件,默认拥有不同的sizeHint;而minimumSizeHint保存了一个建议的最小大小提示。可以使用sizeHint()函数来获取sizeHint的值,使用minimumSizeHint()函数获取minimumSizeHint的值。如果使用setMinimumSize()函数设置了部件的最小大小,那么最小大小提示将会被忽略。

大小策略(sizePolicy)属性
  它也是QWidget类的属性,这个属性保存了部件的默认布局行为,在水平和垂直两个方向分别起作用,控制着部件在布局管理器中的大小变化行为。QSizePolicy类大小策略的取值如下:

常量描述
QSizePolicy::Fixed只能使用sizeHint()提供的值,无法伸缩
QSizePolicy::MinimumsizeHint()提供的大小时最小的,部件可以被拉伸
QSizePolicy::MaximumsizeHint()提供的大小是最大的,部件可以被压缩
QSizePolicy::PreferredsizeHint()提供的大小是最佳大小,部件可以被压缩或拉伸
QSizePolicy::ExpandingsizeHint()提供的是合适的大小,部件可以被压缩,不过它更倾向于被拉伸来获得更多的空间
QSizePolicy::MinimumExpandingsizeHint()提供的大小是最小的,部件倾向于被拉伸来获取更多的空间
QSizePolicy::IgnoredsizeHint()的值被忽略,部件将尽可能地被拉伸来获取更多的空间

伸缩因子
  伸缩因子是用来设置部件间比例的。界面上的字体选择框和一个按钮处于一个水平局部管理器中,现在想让它们的宽度比例为2:1,那么就可以单击对象栏中的horizontalLayout水平布局管理器对象,然后在它的属性栏中将layoutStretch属性设置为"2,1",这样这个水平布局管理器中的两个部件的宽度就是2:1的比例了。如果在代码中进行设置,则可以使用布局管理器的addWidget()函数添加部件的同时,第二个参数指定伸缩因子。

窗体布局管理器相关属性说明
在这里插入图片描述

QLayout类的大小约束属性的取值

常量描述
QLayout::SetDefaultConstraint主窗口大小设置为minimumSize()的值,除非该部件已经有了一个最小大小
QLayout::SetFixedSize主窗口大小设置为sizeHint()的值,它无法改变大小
QLayout::SetMinimumSize主窗口的最小大小设置为minimumSize()的值,它无法再缩小
QLayout::SetMaximumSize主窗口的最大大小设置为maximumSize()的值,它无法再放大
QLayout::SetMinAndMaxSize主窗口的最大大小设置为maximumSize()的值, 最小大小设置为minimumSize()的值
QLayout::SetNoConstraint部件不被约束

可扩展窗口

  一个窗口可能右很多选项是扩充的,只有在有必要的时候才显示出来,这时就可以用一个按钮来隐藏或显示多余的内容,这就是所谓的可扩展窗口。要实现可扩展窗口就要得力于布局管理器的特性,那就是当子部件隐藏时,布局管理器自动缩小,当子部件重新显示时,布局管理器在此放大。一般用setVisible()函数来进行可扩展窗口的设计

分裂器(QSplitter)

  分裂器QSplitter类提供了一个分裂期部件。和QBoxLayout类似,可以完成布局管理器的功能,但是包含在它里面的部件,默认是可以随着分裂器的大小变化而变化的。比如一个按钮放在布局管理器中,它的垂直方向默认是不会被拉伸的,但是放在分裂器中就可以被拉伸。还有一点不同就是,布局管理器继承自QObject类,而分裂期却是继承自QFrame类,QFrame类又继承自QWidget类,也就是说,分裂期有用QWidget类的特性,它是可见的,而且可以像QFrame一样设置边框。

设置伙伴(buddy)

  伙伴是在QLabel类中提出的一个概念,目的是为了方便定位,所以提供了助记符来定位键盘焦点到对应的部件上,这就是QLabel的伙伴,其中助记符就是我们说的加速键。使用英文标签时,在字符串的一个字母前面添加"&"符号,就可以指定这个标签的加速键是Alt加上这个字母;对于中文,需要在小括号中指定加速键字母。

设置Tab键顺序

  对于一个应用程序,有时总希望使用Tab键将焦点从一个部件移动到下一个部件。在设计模式中,设计器提供了Tab键的设置功能,只需在设计模式中找到“编辑->Edit Tab Order”,这时就会显示出各个部件的Tab顺序,只需要单击这些数字就可以更改顺序。或者使用函数setTabOrder(ui->lineEdit,ui->spanBox);//lineEdit在spinBox前面。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值