博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt布局管理(1):部件拉伸原理及大小策略(sizePolicy)
阅读量:4223 次
发布时间:2019-05-26

本文共 3456 字,大约阅读时间需要 11 分钟。

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

本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇)

本文出自本人原创著作《Qt5.10 GUI完全参考手册》网盘地址:

https://pan.baidu.com/s/1iqagt4SEC8PUYx6t3ku39Q
《C++语法详解》网盘地址:https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg

若对C++语法不熟悉,建议参阅本人所著《C++语法详解》一书,电子工业出版社出版,该书语法示例短小精悍,对查阅C++知识点相当方便,并对语法原理进行了透彻、深入详细的讲解,可确保读者彻底弄懂C++的原理,彻底解惑C++,使其知其然更知其所以然。此书是一本全面了解C++不可多得的案头必备图书。

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
#include
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(); }

运行结果及说明见图5-6

在这里插入图片描述

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

#include
#include
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(); }

运行结果及说明见图5-7

在这里插入图片描述

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

#include
#include
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(); }

运行结果及说明见图5-8

在这里插入图片描述
本文作者:黄邦勇帅(原名:黄勇)

你可能感兴趣的文章
动态代理技术的实现与理解
查看>>
使用Beyond Compare合并代码后出现乱码问题
查看>>
dmp数据文件导入问题
查看>>
使用Beyond Compare对比文件夹
查看>>
深入理解java虚拟机 -- jVM高级特性与最佳实践
查看>>
阿里巴巴 java 开发规约
查看>>
impdp命令出现ora-39070解决方案
查看>>
ora-01756
查看>>
java 核心技术Ⅱ--章四:网络
查看>>
java 核心技术Ⅱ--章五:JDBC数据库编程
查看>>
java 核心技术Ⅱ--章六:时间与日期API
查看>>
链表,循环链表,双向链表,判环和入环点
查看>>
浅谈HashMap,HashTable,ConcurrentHashMap,WeakHashMap,HashMap源码分析
查看>>
云创大数据校企合作项目斩获“全国校企合作十佳案例”
查看>>
云创大数据与宽泛科技签订战略合作协议
查看>>
免费!免费!免费!全国高校大数据师资实战免费培训班
查看>>
“南京市独角兽瞪羚企业俱乐部创始人简餐会”走进云创
查看>>
本科大数据专业该怎么上?
查看>>
云创大数据1+X大数据应用部署与调优职业技能等级证书预申报正式开启!
查看>>
人工智能需要一个可被证明的理论作为基础 | 哈佛丘成桐
查看>>