管理窗口部件布局的三种方法:
1、绝对位置法,通过setGeometry()函数设置固定的尺寸和位置,代码如下:
button1->setGeometry(0,0,50,20);
button2->setGeometry(0,20+10,50,20);
lineEdit1->setGeometry(0,2*(20+10),50,20);
lineEdit2->setGeometry(0,3*(20+10),50,20);
setFixedSize(200,200);
这样做有很多缺点:(1)因调用setFixedSize()使用户无法改变窗口大小。(2)当选择了更大的字体或翻译成另一种语言时,可能会改变字体大小导致文本截断。(3)对于某些风格的平台,固定的窗口部件可能具有不适合的尺寸。(4)必须人工计算尺寸和位置,这样做不仅让开发人员感到枯燥,也让后期维护变得困难重重。
2、人工布局法,这种方法和绝对位置法相似,但不同点是控件尺寸可以根据窗口变化而变化,设置窗口最小尺寸,然后重载resizeEvent()函数,让控件随窗口的拉伸进行尺寸的变化,但也包含绝对位置法的一些缺点。代码如下:
{
....
setMinimumSize(200,200);
resize(300,300);
...
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
int extraWidth = width() - minimumWidth();
int extraHeight = height() - minimumHeight();
button1->setGeometry(0,0,50,20); button2->setGeometry(0,20+10+extraHeight,50+extraWidth,20+extraHeight); lineEdit1->setGeometry(0,2*(20+10+extraHeight),50+extraWidth,20+extraHeight); lineEdit2->setGeometry(0,3*(20+10+extraHeight),50+extraWidth,20+extraHeight);
}
3、布局管理法,这种方法是用布局管理器管理窗口部件,布局管理器管理类主要有QHBoxLayout,QVBoxLayout,QGridLayout等,用法比较简单,代码如下:
{
....
widget = new QWidget;
QGridLayout *leftLayout = new QGridLayout;
leftLayout->addWidget(leftButton1,0,0);
leftLayout->addWidget(leftButton2,0,1);
leftLayout->addWidget(leftEdit1,1,0);
leftLayout->addWidget(leftButton3,1,1);
leftLayout->addWidget(leftEdit2,2,0,1,2);
leftLayout->addWidget(leftEdit3,3,0,1,2);
leftLayout->addWidget(leftEdit4,4,0,1,2);
QVBoxLayout *rightLayout = new QVBoxLayout;
rightLayout->addWidget(rightButton1);
rightLayout->addWidget(rightButton2);
rightLayout->addStretch();
rightLayout->addWidget(rightEdit1);
rightLayout->addWidget(rightEdit2);
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
widget->setLayout(mainLayout);
setCentralWidget(widget);
}
本项目没有添加.ui文件,有.ui文件的话窗口有默认大小值。运行后结果如下:

窗口周围的边白和子窗口部件之间的间隔均设置为默认值,如要改变可以分别调用QLayout::setContentsMargins()和QLayout::setSpacing()。
在MainWindow中调用setLayout()出现以下错误:
QWidget::setLayout: Attempting to set QLayout "" on MainWindow "MainWindow", which already has a layout
原因是MainWindow下默认设置了布局,解决方法是创建一个QWidget实例,将布局添加到QWidget中,然后调用setCentralWidget(QWidget *)将QWidget设置为中央窗口显示出来:
{
...
widget = new QWdget;
layout = new QGridLayout;
...
widget->setLayout(layout);
setCentralWidget(widget);
}
布局管理法的优点是,当调节窗口大小,有子部件调用show()或hide()或改变了大小提示(sizeHnit)时,布局都会重新调整自动适应。
设置子窗口部件大小提示和大小策略可以影响布局:
涉及大小提示的函数有sizeHint()、minimunSizeHint()
大小策略的函数有setSizePolicy()