QT布局管理(3)--QLayout/QGridLayout/QFormLayout/QHBoxLayout以及sizeHint、sizePolicy

最基本的布局管理,在设计师界面中可以看到:

各种布局类的继承关系:

QLayout布局QBoxLayout盒型布局QHBoxLayout 水平布局
QVBoxLayout 垂直布局
QFormLayout 两列布局 
QGridLayout 网格布局 
QStackedLayout 堆叠布局 

 

这些东西都是一目了然,不再赘述。

下面主要讲两个知识点:1、sizeHint,2、sizePolicy。这两个东西跟布局有密切关系,想随心所欲的设置布局,必须搞懂这俩东西。

1、sizeHint是所有QWidget都具有的一个属性,不过是只读的,通过sizeHint()函数。他代表的意义是,QT对该控件的推荐大小,也可以认为是控件的默认值。

帮助文档中说,The default implementation of sizeHint() returns an invalid size if there is no layout for this widget, and returns the layout's preferred size otherwise.(翻译:默认情况下,如果widget没有布局,则sizeHint()返回一个无效值,如果有布局,则返回推荐值)

我没理解,什么叫widget有布局,经过测试,QGroupBox是没有推荐值的,它的sizeHint()返回QSize(-1, -1),把QGroupBox放在布局中,返回值还是无效值QSize(-1, -1)。经过测试,大多数控件是有推荐值的,随便拖了几个控件出来,结果如下:

ui->pushButton->sizeHint() =  QSize(75, 23)
ui->groupBox->sizeHint() =  QSize(-1, -1)
ui->label->sizeHint() =  QSize(54, 12)
ui->tabWidget->sizeHint() =  QSize(114, 26)
ui->comboBox->sizeHint() =  QSize(69, 20)
ui->listView->sizeHint() =  QSize(256, 192)
ui->checkBox->sizeHint() =  QSize(71, 16)
ui->lineEdit->sizeHint() =  QSize(133, 20)
ui->textEdit->sizeHint() =  QSize(256, 192)

即使改变控件的实际大小,sizeHint也仍然保持上面的值不变。

2、sizePolicy

sizePolicy包含了水平伸缩策略、垂直伸缩策略、水平伸缩因子、垂直伸展因子,见下图:

水平、垂直伸展因子,就是设置占空的比例,例如水平方向共有3个控件,分别设置水平伸展因子为1、1、2,那么他们三个将在水平控件上各占25%、25%、50%。

 

关于水平伸缩策略、垂直伸缩策略QSizePolicy::Policy,从帮助文档抄来的表,做了翻译,如下:

  以下伸缩策略执行完之后,还要再被“最大最小尺寸”再次限定。也即,“伸缩策略”的优先权<“最大最小尺寸”
QSizePolicy::Fixed0不可伸缩,恒为QT的推荐值sizeHint()的大小。(注意,有些控件的推荐值为(-1,-1),该策略会导致不显示)
QSizePolicy::MinimumGrowFlag可伸缩,但是被限定了最小值为sizeHint,伸缩范围[hint,∞]
QSizePolicy::MaximumShrinkFlag可伸缩,但是被限定了最大值为sizeHint
QSizePolicy::PreferredGrowFlag | ShrinkFlag可伸缩,范围为[hint或小非0值,∞],伸长的优先权<Expanding,但是即使被挤也不会被挤扁成0,一般会被挤成sizeHint(有hint时),或者小方框(无hint时)
QSizePolicy::ExpandingGrowFlag | ShrinkFlag | ExpandFlag可伸缩,而且能伸就伸,
QSizePolicy::MinimumExpandingGrowFlag | ExpandFlag可伸缩,而且能伸就伸,但是被限定了最小值为sizeHint,伸长优先权=Expanding>Preferred
QSizePolicy::IgnoredShrinkFlag | GrowFlag | IgnoreFlag可伸缩,范围为[0,∞],区别在于不管有无hint,Ignored可以被挤扁为0。Minimum、Maximum、Preferred这三个只要>hint的空间,就不会来挤Ignored
注意:“最大最小尺寸”就是minimumSize()/maximumSize()/minimunWidth()等共6个,以上伸缩策略都是在最大最小尺寸区间内进行的
以下是真值
QSizePolicy::GrowFlag1具备>sizeHint的能力
QSizePolicy::ExpandFlag2尽可能的多占空
QSizePolicy::ShrinkFlag4具备<sizeHint的能力
QSizePolicy::IgnoreFlag8尽可能的多占空,但占空能力<ExpandFlag

尤其注意:

QSizePolicy::Minimum这个词有点误导人,看名字感觉像是打算令控件能多小就多小,实际上其意义却是:控件可伸可缩,但要限制其最小值。同类的误导词还有:QSizePolicy::Maximum。
QSizePolicy::Ignored这个词也很误导人,从名字上看,感觉像是让这个控件不参加伸缩,实际上其意义却是:忽略sizeHint的限制。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值