Qt佈局管理(1):部件拉伸原理及大小策略(sizePolicy)
Qt佈局管理(1):部件拉伸(Stretch)原理及大小策略(sizePolicy)
本文為原創文章,轉載請註明出處,或註明轉載自“黃邦勇帥(原名:黃勇)
若對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<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(); }
執行結果及說明見圖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(); }
執行結果及說明見圖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(); }
執行結果及說明見圖5-8
本文作者:黃邦勇帥(原名:黃勇)