申明:本文转载自“黄邦勇帅(原名:黄勇)
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();}
12345678910111213141516
运行结果及说明见图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();}
12345678910
运行结果及说明见图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();}
1234567891011121314151617
运行结果及说明见图5-8