Qt佈局管理(3):內容邊距、間距和QSpacerItem類
阿新 • • 發佈:2018-11-11
Qt佈局管理(3):內容邊距(ContentsMargins)、間距(spacing)和QSpacerItem類
若對C++語法不熟悉可參閱《C++語法詳解》一書,電子工業出版社出版
內容邊距就是頁邊距,指的是佈局中的各子部件(內容)與周圍四個邊的距離,內容邊距比較簡單,下面列出需要使用到的函式(內容邊距預設情況下使用的是樣式提供的值,在大多數平臺上,預設為11畫素)
QMargins QLayout::contentsMargins() const; void QLayout::getContentsMargins(int *left, int *top, int *right, int *bottom) const; void QLayout::setContentsMargins(int left, int top, int right, int bottom); void QLayout::setContentsMargins(const QMargins& margin);
間距(spacing)指的是各部件之間的距離。間距有兩種方式實現,一種是向各部件間新增一個QSpacerItem例項,一種是直接指定各部件間的距離。
1、QSpacerItem類
使用QSpacerItem類可以建立自定義的間距,使用該類建立的間距相當於是一個空白部件,它是佈局中的一個專案,會在佈局中佔據一個位置,佈局會為其分配一個索引號,也就是說由QSpacerItem類建立的物件是可以由佈局管理器進行管理的。通常不需要使用這個類,因為在各佈局管理器中有相應的函式代替了該類的功能。該類包括解構函式在內,總共只有4個公有的成員函式,其餘函式都是從其父類繼承而來的受保護的函式,以下為這些成員函式
①、QSpacerItem(int w, int h, QSizePolicy::Policy hPolicy = QSizePolicy::Minimum, QSizePolicy::Policy vPolicy = QSizePolicy::Minimum) //建構函式 void changeSize(int w, int h, QSizePolicy::Policy hPolicy = QSizePolicy::Minimum, QSizePolicy::Policy vPolicy = QSizePolicy::Minimum) 以上函式表示構造或修改一個具有寬度為w,高度為h,水平方向的大小策略為hPolicy,垂直方向大小策略為vPolicy的間距(即QSpacerItem例項)。 ②、QSizePolicy sizePolicy() const; //返回此間距使用的大小策略。
4、設定間距
因不同佈局管理器使用的設定間距的函式不相同,下面先講解QBoxLayout佈局中的間距函式。注意:向佈局中新增或插入的間距是QSpacerItem,因此佈局會為QSpacerItem分配一個索引號,這會改變各部件之間的原有索引號,比如在索引為0的按鈕1和索引為1的鈕2之間插入一個QSpacerItem之後,則按鈕1的索引仍為0,QSpacerItem的索引為1,按鈕2的索引為2,
①、void QBoxLayout::addSpacing(int size); //把大小為size的不可拉伸間距(QSpacerItem)新增到佈局的末尾。
②、void QBoxLayout::insertSpacing(int index, int size);
在索引index處,插入大小為size的不可拉伸間距(QSpacerItem)。若索引為負則新增到末尾。
③、void QBoxLayout::addStretch(int strecth = 0);
把具有零最小大小和拉伸因子為strecth的可拉伸間距(QSpacerItem)新增到佈局的末尾。
④、void QBoxLayout::insertStretch(int index, int stretch =0);
在索引index處,插入最小大小為0,拉伸因子為stretch的可拉伸間距(QSpacerItem)。若索引為負,則新增到末尾。
⑤、void QBoxLayout::insertSpacerItem(int index, QSpacerItem* spacerItem);
在索引index處,插入最小大小為0,拉伸因子為0的spacerItem。若索引為負則新增到末尾。
⑥、void QBoxLayout::addSpacerItem(QSpacerItem* spacerItem); //把spacerItem新增到佈局的末尾。
5、下面為QLayout類中與間距有關的屬性
spacing:int 訪問函式:void setSpacing(int ); int spacing() const; //QLayout類中的屬性
設定和獲取佈局內部部件之間的間距,若未設定值,則從父佈局或父視窗部件的樣式繼承。
若在QGridLayout和QFormLayout佈局中使用setHorizontalSpacing()和setVerticalSpacing()在水平和垂直方向設定了不同的間距,則Spacing()函式返回−1。
設定該屬性會使所有部件之間都有所設定的間距。
注意:spacing屬性設定的間距不是一個QSpacerItem,它不是佈局中的一個專案,spcing屬性只是設定了兩部件之間的距離,在這之間未插入任何東西,因此佈局不會為其分配索引號。
示例5.5:間距簡單應用
#include<QtWidgets>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){ QApplication a(argc,argv);
QWidget w;
QPushButton *pb=new QPushButton("AAA"); QPushButton *pb1=new QPushButton("BBB");
QPushButton *pb2=new QPushButton("CCC"); QPushButton *pb3=new QPushButton("DDD");
pb->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed);
pb1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
pb2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
QHBoxLayout *pg=new QHBoxLayout;
pg->addWidget(pb);
pg->addStretch(1); //新增一個拉伸因子為1的間距(QSpacerItem)
pg->addWidget(pb1);
pg->addStretch(2);//新增一個拉伸因子為2的間距
pg->addWidget(pb2);
w.setLayout(pg); w.resize(300,100); w.show(); return a.exec(); }
執行結果及說明見圖5-12
示例5.6:間距與空白部件
#include<QtWidgets>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){ QApplication a(argc,argv);
QWidget w;
QPushButton *pb=new QPushButton("AAA"); QPushButton *pb1=new QPushButton("BBB");
QPushButton *pb2=new QPushButton("CCC");
QHBoxLayout *pg=new QHBoxLayout;
QSpacerItem *sp=new QSpacerItem(22,22); //建立一個寬和高都為22的QSpacerItem
pg->setSpacing(22); /*設定spacing屬性,使每個子部件之間的間距為22,spacing屬性設定的間距不是空白部件,不會被分配索引號*/
pg->addWidget(pb);
pg->addSpacing(22); //新增一個間距(QSpacerItem),該間距是空白部件,會分配一個索引號。
pg->addWidget(pb1);
pg->addWidget(pb2);
pg->insertSpacerItem(1,sp); /*把QSpacerItem例項sp插入索引為1的位置,注意sp是空白部件,會分配一個索引號。*/
pg->setStretch(1,1); //把索引為1的部件(即上一行插入的sp)的拉伸因子設定為1
pg->insertStretch(4,1); //插入一個拉伸因子為1的間距(QSpacerItem)
pg->insertStretch(6,2);
w.setLayout(pg); w.resize(300,100); w.show(); return a.exec(); }
執行結果及說明見圖5-13
本文作者:黃邦勇帥(原名:黃勇)