Qt提供的在窗体中摆放窗口部件的类:QHBoxLayout、QVBoxLayout、QGridLayout和QStackLayout。
可以执行布局管理功能的其他类还有QSplitter、QScrollArea、QMainWindow和QMdiArea。这些类拥有的共同点在于它们提供了一种永和可以灵活掌握的布局格式。
在窗体中摆放窗口部件
1.绝对布局:setGeometry(左上角x的值,左上角y的值,宽值,高值)
如,namedLabel->setGeometry(9, 9, 50, 25)
2.人工布局:尽管还是需要给定窗口部件的绝对位置,但是利用人工布局方法给定的大小尺寸总是可以和窗口的大小成比例。通过重新实现窗体的resizeEvent()函数,该函数可以设置窗体中的子窗口部件的几何形状,就可以实现人工布局法。如:
构造函数中设置最小值和修改后的大小,setMinimumSize(265, 190);resize(365, 240);
void FindFileDialog::resizeEvent(QResizeEvent*)
{
int extraWidth = width() - minimumWidth();
int extraHeight = height() - minimumHeight();
... ...
// 布局根据差值使用SetGeometry进行设置
}
3.使用布局管理器
QHBoxLayout、QVBoxLayout和QGridLayout继承自QLayout。如:
QGridLayout* leftLayout = new GridLayout;
leftLayout->addWidget(namedLabel, 0, 0);
leftLayout->addWidget(namedLineEdit, 0, 1);
leftLayout->addWidtet(subfoldersCheckBox, 1, 0, 1, 2);
... ...
QVBoxLayout* rightLayout = new QVBoxLayout;
rightLayout->addWidght(findButton);
rightLayout->addStretch(); // 告诉垂直管理器,它会占满布局中这一处的空间
rightLayout->addWidth(helButton);
... ...
QHBoxLayout* mainLayout = new QHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
setLayout(mainLayout);
对于QGridLayout::addWidget()的调用遵循如下语法形式
layout->addWidget(widget, row, column, rowSpan, columnSpan); // rowSpan和columnSpan默认值为1
对话框周围的边白和两个子窗口部件之间的间隔均被设置为默认值,该值取决于当前窗口部件的风格,但通过QLayout::setContensMargins()和QLayout::setSpacing(),可以对它们的值进行修改。
优点:
(1)布局添加、删除一个窗口部件,布局自适应;
(2)子窗口部件调用hide()或show(),布局自适应;
(3)子窗口部件大小发生变化,布局自动调整;
(4)布局管理器会自动根据窗体中子窗口部件的最小大小提示和大小提示,从总体上为这个窗体设置一个最小尺寸。
4.由于不可能为每一种可能产生的布局都提供唯一的默认值,所以在一个窗体中,开发人员改变它上面的一个或两个窗口部件的大小策略是非常普遍的现象。一个QSizePolicy既包含一个水平分量也包含一个垂直分量,可以使用函数setHorizontalPolicy设置水平方向分量,控件使用setSizePolicy设置QSizePolicy策略值,以下是一些最为常用的取值:
(1)Fixed:该窗口部件不能被拉伸或压缩。窗口部件的大小尺寸总是保持为其大小提示的尺寸;
(2)Minimum:该窗口部件的大小提示即他的最小大小。再不能把窗口部件压缩到比这个大小提示还要小的大小,但是如有必要,可以拉伸它来填充尽可能多的空间;
(3)Maximum:该窗口部件的大小提示就是他的最大大小。但是可以把该窗口部件压缩成它的最小大小提示的尺寸;
(4)Preferred:该窗口部件的大小提示就是它比较合适的大小。但是如果需要,还是可以对窗口部件进行拉伸或者压缩;
(5)Expanding:可以拉伸或者压缩该窗口部件,并且它特别希望能够变长变高。
在重新改变一个既包含有Preferred又包含有Expanding窗口部件的窗体尺寸大小时,多出来的空间就会分配给Expanding窗口部件,而Preferred窗口部件仍旧会按照原有大小提示而保持不变。
QSizePolicy类还保存了水平方向和垂直方向的一个拉伸因子。这些拉伸因子可以用来说明在增大窗体时,对不同的子窗口部件应使用不同放大比例。如使用setHorizontalStretch()来设置水平方向的缩放因子。
sizeHint返回一个推荐的大小尺寸