最基本的布局管理,在设计师界面中可以看到:
各种布局类的继承关系:
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::Fixed | 0 | 不可伸缩,恒为QT的推荐值sizeHint()的大小。(注意,有些控件的推荐值为(-1,-1),该策略会导致不显示) |
QSizePolicy::Minimum | GrowFlag | 可伸缩,但是被限定了最小值为sizeHint,伸缩范围[hint,∞] |
QSizePolicy::Maximum | ShrinkFlag | 可伸缩,但是被限定了最大值为sizeHint |
QSizePolicy::Preferred | GrowFlag | ShrinkFlag | 可伸缩,范围为[hint或小非0值,∞],伸长的优先权<Expanding,但是即使被挤也不会被挤扁成0,一般会被挤成sizeHint(有hint时),或者小方框(无hint时) |
QSizePolicy::Expanding | GrowFlag | ShrinkFlag | ExpandFlag | 可伸缩,而且能伸就伸, |
QSizePolicy::MinimumExpanding | GrowFlag | ExpandFlag | 可伸缩,而且能伸就伸,但是被限定了最小值为sizeHint,伸长优先权=Expanding>Preferred |
QSizePolicy::Ignored | ShrinkFlag | GrowFlag | IgnoreFlag | 可伸缩,范围为[0,∞],区别在于不管有无hint,Ignored可以被挤扁为0。Minimum、Maximum、Preferred这三个只要>hint的空间,就不会来挤Ignored |
注意:“最大最小尺寸”就是minimumSize()/maximumSize()/minimunWidth()等共6个,以上伸缩策略都是在最大最小尺寸区间内进行的 | ||
以下是真值 | ||
QSizePolicy::GrowFlag | 1 | 具备>sizeHint的能力 |
QSizePolicy::ExpandFlag | 2 | 尽可能的多占空 |
QSizePolicy::ShrinkFlag | 4 | 具备<sizeHint的能力 |
QSizePolicy::IgnoreFlag | 8 | 尽可能的多占空,但占空能力<ExpandFlag |
尤其注意:
QSizePolicy::Minimum这个词有点误导人,看名字感觉像是打算令控件能多小就多小,实际上其意义却是:控件可伸可缩,但要限制其最小值。同类的误导词还有:QSizePolicy::Maximum。
QSizePolicy::Ignored这个词也很误导人,从名字上看,感觉像是让这个控件不参加伸缩,实际上其意义却是:忽略sizeHint的限制。