布局管理有关事项

布局管理器可以通过设置layoutLeftMargin等设置布局管理器到界面边界的距离,比较特殊的是QFormLayout窗体布局管理器,它用来管理表单的输入部件以及他们相关的标签,不过它还特别适合用来表单类似的设计,一般用法:

QFormLayout *layout = new QFormLayout;
layout->addRow(button1, lineEdit1);
layout->addRow(button2, lineEdit2);
layout->addRow(button3, lineEdit3);

它有一个setRowWrapPolicy(RowWrapPolicy policy)函数,是设置换行策略,参数类型是QFormLayout::RowWrapPolicy枚举类型

凡是继承QWidget的类都有sizeHint大小提示和minimumSizeHint最小大小提示,sizeHint保存了部件的建议大小,而MinmumSizeHint保存了一个建议的最小大小提示,如果使用了setMinimumSize函数设置了部件的最小大小,那么最小大小提示将会被忽略。大小策略sizePolicy属性保存了部件的默认布局行为,它在水平和垂直两个方向分别起作用,它有多个取值

  1. Fixed                大小提示就是它的大小,不能压缩或者拉伸
  2. Minimum         大小提示是最小大小,能被拉伸不能压缩到比大小提示更小
  3. Maximum        大小提示就是最大大小,不能被拉伸到比大小提示更大,能压缩
  4. Preferred          大小提示就是它比较合适的大小,但是有需要也可以对它进行拉伸或者压缩
  5. Expanding        可以拉伸或者压缩它,并且它特别希望能够变长或者变高

Preferred和Expanding的区别在于同时存在Preferred和Expanding时,多余得空空间会分配给Expanding

还有一个枚举很特别

  • 枚举QSizePolicy::PolicyFlag

    这些标志被组合在一起,以形成一系列大小策略值。

常量 描述
QSizePolicy::GrowFlag 1 部件可以在必要时增长至超过它的尺寸。
QSizePolicy::ExpandFlag 2 部件应该得到尽可能多的空间。
QSizePolicy::ShrinkFlag 4 部件可以在必要时缩小至小于它的尺寸。
QSizePolicy::IgnoreFlag 8 部件的缺省大小被忽略,它将会得到尽可能多的空间。

如果你的控件的优先选用的高度依赖于它的实际宽度(比如一个自动断词的标签),在sizePolicy()中设置hasHeightForWidth()标记,并且重新实现QWidget::heightForWidth()。即使你实现了heightForWidth(),提供一个好的sizeHint()仍然是必需的。

布局管理器有一个layoutSizeConstraint属性,它用来约束窗口大小,只对顶级管理器有用,因为它只对窗口有用,对其他子部件没有效果主要的值有

  1. QLayout::SetDefaultConstraint                    主窗口大小设置为minimumSize的值,除非部件有一个最小大小
  2. QLayout::SetFixedSize                                  主窗口大小设置为sizeHint()的值,它无法改变大小
  3. QLayout::SetMinimumSize                           主窗口大小设置为minimumSize的值,它无法再缩小
  4. QLayout::SetMaximumSize                            主窗口最大大小设置为maximumSize()的值,无法再放大
  5. QLayout::SetMinAndMaxSize                        主窗口大小设置为minimumSize值,最大大小设置为maximumSize值


对于布局管理器,我们都可以设置它们的边距,通过

  • setMargin(int)    上下左右设置统一的边距
  • setContentsMargins(int left, int top, int right, int bottom);   分别设置上下左右的边距
  • setContentsMargins(const QMargins &margins) 
    设置外边距

setSpacing(int) 设置间距,默认之间的间距是相同的

在栅格布局中,每个列(以及行)都有一个最小宽度(使用setColumnMinimumWidth()设置)以及一个伸缩因子(使用setColumnStretch()设置)。利用好缩放因子能得到我们想要的大小布局,最小宽度指的是位于该列中的窗口部件的最小的宽度,而伸缩因子决定了该列内的窗口部件能够获得多少空间。

QStackedLayout类提供了多页面切换的布局,一次只能看到一个界面。主要的使用就是addWidget来添加一个页面void currentChanged(int index)当前页面发生变化时候发射,index为新的索引值。值得一提的是QStackedWidget和它很类似,不过QStackedWidget是部件而QStackedLayout是一个布局。

QSpacerItem类为布局提供了一个空白区。布局可以使用

Layout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Expanding))
正常的添加中添加一个SpacerItem就在中间产生一个指定大小的空白区域


QSplitter可以包含一些其他窗口部件的窗口部件,在切分窗口部件会通过切分条而分隔开,它最特别的是它可以有自己的外形,使用方法很简单,直接使用addWidget即可


停靠窗口是可以停靠在QMainWindow中或浮动为独立窗口的窗口,它都是QDockWidget的实例,4个角可以属于任何他们相邻的任何一个停靠区域,也可以通过setCorner(Qt::TopLeftCorner,Qt::LeftDockWidgetArea)来指定,常规用法

QDockWidget* shapesDockWidget=new QDockWidget(tr("Shaper"));
shapesDockWidget->setObjectName("shapesDockWidget");
shapesDockWidget->setWidget(treeWidget);
shapesDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
addDockWidget(Qt::RightDockWidgetArea,shapesDockWidget); //这个才是真正的添加停靠窗口到指定区域
setAllowerAreas()调用说明对停靠区域加以限定,只有给出的区域才可以接受停靠

猜你喜欢

转载自blog.csdn.net/weixin_38893389/article/details/80830666