Qt布局管理--部件拉伸(Stretch)原理及大小策略(sizePolicy)

申明:本文转载自“黄邦勇帅(原名:黄勇)

Qt布局管理(1):部件拉伸(Stretch)原理及大小策略(sizePolicy)

1、部件的大小策略sizePolicy、大小限制、拉伸因子(Stretch Factors)的含义
部件的大小策略、大小限制、拉伸因子从三个方面对布局内的部件怎样进行拉伸以填满布局进行了说明。
拉伸因子描述了各个部件在进行拉伸时,多个部件之间应以怎样的比例进行拉伸,比如把按钮1、按钮2、按钮3的拉伸因子分别为设置为1,2,3,则按钮将按1:2:3的大小进行拉伸以填满整个布局空间(见图5-1)。注意:当主窗口的大小不能按计算出来的比例容纳下所有子部件时,子部件不一定会按设计好的比例进行排列。
在这里插入图片描述
大小策略规定了部件以何种方式进行拉伸及压缩,比如部件不能被拉伸或压缩,部件不能被压缩得比大小提示更小等。
部件的大小限制限制了部件可以被拉伸或压缩的范围,比如不能把部件压缩得比最小大小更小,或不能拉伸得比最大大小更大等。
2、QWidget类中对部件大小进行限制的属性
在这里插入图片描述
3、设置拉伸因子的函数
在这里插入图片描述
4、设置大小策略
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5、大小策略与拉伸因子之间的关系
若部件的拉伸因子大于0,则按照拉伸因子的比例分配空间;若拉伸因子为0,则只有在其他部件不需要空间时才会获得空间;也就是说若一些部件拉伸因子大于0,而一些部件拉伸因子为0,则只有拉伸因子大于0的部件会被拉伸,而拉伸因子为0的部件不会被拉伸。
若所有部件的拉伸因子都为0,则按照大小策略的规则对部件进行拉伸。
注意:若部件的大小策略为Fixed,则即使设置了拉伸因子,该部件也不会被拉伸。
以上规则可总结为,拉伸因子会使大小策略不起作用或失效(除了Fixed策略外)
除QSizePolicy::Ignored外,任何部件,都不能压缩得比最小大小更小(若未设置最小大小,则为最小大小提示),任何部件都不能拉伸得比最大大小更大。
示例5.1:大小限制对大小策略的影响

#include<QtWidgets>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){    QApplication a(argc,argv);
QWidget w;		QPushButton *pb=new QPushButton("Fixed");
QPushButton *pb1=new QPushButton("MaxSetMin");		QPushButton *pb2=new QPushButton("MaxNoMin");
//为部件设置大小策略
pb->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
pb1->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Fixed);
pb2->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Fixed);
QHBoxLayout *pg=new QHBoxLayout;
pb->resize(222,222);     //使用布局后,resize函数将不再起作用
pb->setMinimumWidth(11);		pb->setMaximumWidth(188);   //为pb设置最大/最小大小
pb1->setMinimumWidth(1);    //为pb1设置最小大小
pg->addWidget(pb);		pg->addWidget(pb1);		pg->addWidget(pb2);		w.setLayout(pg);
w.resize(300,200);       w.show();    return a.exec();		}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

运行结果及说明见图5-6
在这里插入图片描述

示例5.2:部件的优先扩展权

#include<QtWidgets>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){    QApplication a(argc,argv);
    QWidget w;	    QPushButton *pb=new QPushButton("Preferred");
    QPushButton *pb1=new QPushButton("Expanding");   //该部件具有优先扩展权
    pb->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed);
    pb1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
    QHBoxLayout *pg=new QHBoxLayout;    pg->addWidget(pb);    pg->addWidget(pb1);
    w.setLayout(pg);	w.resize(300,200);       w.show();    return a.exec();	}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

运行结果及说明见图5-7
在这里插入图片描述

示例5.3:拉伸因子与大小策略的关系

#include<QtWidgets>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){    QApplication a(argc,argv);
    QWidget w;	    QPushButton *pb=new QPushButton("Preferred");
    QPushButton *pb1=new QPushButton("Expanding");    QPushButton *pb2=new QPushButton("xxx");
    QPushButton *pb3=new QPushButton("Ignore");
    pb->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed);
    pb1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
    pb2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
    pb3->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Fixed);
    QHBoxLayout *pg=new QHBoxLayout;
pg->addWidget(pb);    	pg->addWidget(pb1);		
pg->addWidget(pb2);		pg->addWidget(pb3);
//拉伸因子应位于addWidget()之后,否则拉伸因子将不起作用,设置拉伸因子后扩展优先权将不起作用。
    pg->setStretch(0,1);   	pg->setStretchFactor(pb1,3);	   pg->setStretch(3,2);
w.setLayout(pg);    w.resize(300,100);        w.show();    return a.exec();		}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

运行结果及说明见图5-8
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值