管理窗口部件布局的三种方法:

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()

 

 posted on 2020-12-06 15:14  拳击手乌小冬  阅读(105)  评论(0编辑  收藏  举报