<C++ QT4 GUI 编程>第六章笔记

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值