1. 程式人生 > >Qt佈局管理(3):內容邊距、間距和QSpacerItem類

Qt佈局管理(3):內容邊距、間距和QSpacerItem類

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
在這裡插入圖片描述

本文作者:黃邦勇帥(原名:黃勇)