本文共 3456 字,大约阅读时间需要 11 分钟。
本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇)
本文出自本人原创著作《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
本文作者:黄邦勇帅(原名:黄勇)