美文网首页
QLayout布局类

QLayout布局类

作者: Alliawell | 来源:发表于2024-04-26 10:13 被阅读0次

Layout用来管理widgets,但是widgets的parent只能是widget,不能是layout。layout中所有widget的parent是layout的parentWidget()。

Qt帮助文档里的Layout Management详细介绍了各个layout的使用。(QSplitter不是layout,而是个widget)

QT中提供的布局器控件[1] 图1. 常用布局器的继承关系 图2. QSizePolicy的4个标志 图3. Layout的几种选项

Layout对Widget的影响

Layout对其中的widget做如下处理:

1.所有的widgest都根据QWidget::sizePolicy()和QWidget::sizeHit()被分配空间。

2.如果widgets有非零的拉伸因子(stretch factor),他们会根据比例获得空间(看下一条)。

3.如果widgets的拉伸因子被设为0,则只有在其他widget不需要空间时才会获得更多空间。没有拉伸因子时,有Expanding属性的会优先获得更多空间。

4.Widget如果分配的空间小于minimum值(或minimum size hint如果没有指定最小值),则他们会分配到最小的值。minimum=0就是没有设置。(当设置的stretch factor来决定大小时,则不需要设置mini或mini hint.)

5.当widget分配的空间大于maximum szie,他们会被分配到maximum size(如果有stretch factor,则不需要有最大值)。

QLayout永远不会把widget的大小变得比minimumSizeHint小,除非设置了minimum size或size policy设为QSizePolicy::Ignore. 如果设置了minimum size,则minimum size hint自动被忽略。

总结:Layout先看拉伸因子,没有拉伸因子看expanding。大小先看minSize和maxSize,然后看minSizeHint。

QLayoutBox类

QLayoutBox占用从父Layout或parentWidget对象分得的空间,把空间分成若干个box,并让它内部的widget填满一个box(由于是填满,因此当Layout大小改变时,里面的widget的大小也会改变)。

图4. 默认填满Layout,有弹簧时则不变

如果QBoxLayout不是顶层的layout(它没有管理widget的所有空间和子对象),在使用它之前,你必须添加它到其父layout,最常用的方法是调用parentLayout->addLayout()。

一个QBoxLayout如果没有父layout,则它必须有一个parentWidget,它的大小会随父对象缩放,其内部的widget也会随它缩放(因为要填满空间)。

Layout内部的widget都变成了其parentWidget()的子对象。

图4中最外层的QVBoxLayout有个隐含的parentWidget(通过*_ui.h代码可以看到),大小就是QVBoxLayout的大小,且不变。此时当整个窗口改变大小时,Layout的大小不变,因此其内部button的大小也不会变。

如果把layout的父对象设为整个窗口,则窗口大小变化时,layout内部的button就会跟随改变。

拉伸因子stretch很有用,可以设置各个box拉伸的比例,0就是不拉伸 HboxLayout的拉伸因子设为1:2:3

QFormLayout类

QFormLayout用来管理2列的输入表单,左边列通常是Label,右边列通常是输入框,如LineEdit,SpinBox等。

传统上,习惯使用2列的QGridLayout来管理表单,但QFormLayout提供了更高级的功能:

1)根据不同的OS平台自动调整外观。

2)可以wrap(换行)长的row,对小的显示器很友好。

3)API更友好,addRow()可以直接拿添加Label。

FormLayout的实例 Layou还可以调整各种布局的距离

参考

[1].Qt界面设计时使各控件依据窗口缩放进行自适应填充的方法——使用布局、Spacer等控件

相关文章

  • Day03

    布局管理器 QLayout是布局管理器的基类,是一个抽象基类。最常用的QLayout的几个子类,分别是QBoxLa...

  • 2019-02-05 8 关于QLayout的用法

    QLayout是一个抽象类,不可视,只能用来布局窗口的表现方式。 QHBoxLayout和QVBoxLayout是...

  • QSplitter拆分窗口

    QSplitter拆分窗口: 不同QSplitter对象通过指定父子关系来完成嵌套(和布局QLayout一样) Q...

  • QLayout 布局常见使用方法

    常用的三种布局方法: 水平布局类QHBoxLayout垂直布局类QVBoxLayout网格布局类QGridLayo...

  • 019_ViewPager +Fragment+TabLayou

    需要导入的依赖 MainActivity类布局 Fragment布局 MyFragment类 MainActivi...

  • 4.1 容器类Widget-Padding

    原文在此,这里只为学习 容器类Widget和布局类Widget区别 共同点容器类Widget和布局类Widget都...

  • Android可控图片旋转

    布局 MainActivity类

  • Flutter 容器 Padding

    容器类Widget 不同于 布局类Widget: 首先,布局类Widget 的子Widget 一般都是数组,而容器...

  • UICollectionViewLayoutAttributes

    collectionView的item布局其实是LayoutAttributes类具体配置的,这个类可以配置的布局...

  • 05-Flutter 布局类组件

    布局类组件 Column 和 Row 竖向或者横向的线性布局 Flex 弹性布局,按比例布局 Wrap 流式布局...

网友评论

      本文标题:QLayout布局类

      本文链接:https://www.haomeiwen.com/subject/rhvnxjtx.html