1. 程式人生 > >傳說中的QT佈局

傳說中的QT佈局

1、QFormLayout:表單佈局,顧名思義就是實現表單模式的佈局。表單就是提示使用者進行互動的一種模式,其主要有兩個列組成,第一個列用於顯示資訊,給予用提提示,一般叫做label域,第二個是需要使用者選擇輸入的,一般叫field域。表單就是很多由這兩項/兩列內容組成的行的佈局。label與field關係就是label是關聯field的。

   表單佈局完全可以使用表格佈局實現,是一種多行兩列的列表,但表單佈局提供一種比較完善的策略,其主要有以下優點

   1)可以適應不同平臺外觀和感覺的一致性

   2)支援一行的label和field域換行顯示,有兩種策略一種是如果輸入域過長,field換行顯示,還有一種就是不管怎麼樣都換行顯示,當然預設是一行顯示兩個域就可以了

   3)創造label--field對很便捷的介面,因為使用一般的佈局,想要關聯label和field,建立好label和feild,並且呼叫label的setBuddy才能完成,但formlayout使用addRow就可以直接對應了。

   表單佈局的樣式可以通過幾個方面體現

   1)label的樣式,是左對齊還是右對齊,可以使用setLabelAlignment進行設定

   2)form的樣式,其內容的顯示方式,則可以通過setFormAlignment進行設定

   3)表單一行內容的顯示,是否換行,則使用setRowWrapPolicy設定,主要值是DontWrap

   Rows,即Field域永遠跟著其label;WrapLongRows,給予label足夠的空間,剩餘的空間給field域,如果field域的最小空間比剩餘的控制元件大/寬,則field會換行到下一行顯示;WrapAllRows,所有的field域不管後面剩餘的空間是否夠,都自動換行。

   4)filed域拉昇生長策略growth policy,其主要是FieldGrowthPolicy控制,首先是FieldStayAtSizeHint 0 ,field域永遠不會超過有效的sizehint尺寸;ExpandingFieldGrow 1,field域水平尺寸拉昇或者最小值超出時會佔用可用空間,其他field在sizehint尺寸下不會擴大grow;AllNonFixedFieldGrow 2所有的field允許他們長grow就長grow到填充可用的空間,如果是fixed固定尺寸策略的field則不會長

   表單由兩列組成,所以一本都是分為label和field域,但是有些控制元件佔用兩行,所以對每個行其可以通過角色來訪問,如LabelRole 0,一個label控制元件,FieldRole 1,一個field空間,SpanningRole就是佔用了label和field兩列的控制元件。當訪問某一個行的某個特定的空間時,如果不知道具體名,則可以通過此角色訪問。

   1.1 表單佈局formLayout的屬性

   1)fieldGrowthPolicy :FieldGrowthPolicy ,表示feild域如何擴張延伸的方式

   如果沒有任何一個field域可以延伸並且表單form重置了大小,多餘的空間會根據當前的表單form aligment對齊方式分部。

   fieldGrowthPolicy()獲取此屬性。setFieldGrowthPolicy(FieldGrowthPolicy)進行設定

   2)formAligment : Qt::Alignment ,此屬性表示扁擔佈局formlayout內容的對齊方式。使用formAlignment()獲取,setFormAlignment(Qt::Alignment)進行設定

   3)horizontalSpacing :int表示每行空間之間的空間間隔。通過horizontalSpacing()獲取,setHorizontalSpacing(int)設定

   4)域horizontalSpacing對應的是verticalSpacing儲存了垂直放置的控制元件之間的間隔。verticalSpacing獲取,setVerticalSpacing設定。

   5)labelAlignment:Qt::Alignment 儲存標籤label水平方向的對齊alignment模式。

   通過labelAlignment()獲取,setLabelAlignment進行設定。

   6)rowWrapPolicy : RowWrapPolicy儲存錶行每行換行的方式。其可見值概述已做詳細描述

   1.2 QFormLayout的介面

   表單佈局是以行作為基本單位的,所以需要為表單佈局新增控制元件,一個是標籤域label,一個是輸入域field,通過addRow方法進行新增。

   1)新增一行表單

   新增第一個域可以是QWidget或者QString,如果是後者會自動建立一個QLabel,並且將field的QWidget設定為label的buddy。field可以是QLayout或者QWidget。

   如果是佔用兩行的空間,則只有一個變數,可以是QWidget或者QLayout。具體形式如下

   void addRow(QWidget *label,QWidget *field):新增一行到佈局末尾,使用label和field填充表單佈局的對應域。

   void addRow(QWidget *label,QLayout *layout):

   void addRow(const QString *labelText,QWidget *widget):會把widget設定為qlabel的buddy

   void addRow(const QString *labelText,QLayout *layout):

   void addRow(QWidget *widget):佔用兩列

   void addRow(QLayout *layout):佔用兩列

   int count(),返回有多少個元素,在後續查詢、插入和刪除的時候用。

   2)查詢元素

   void getItemPosition(int index,int *rowPtr,ItemRole *rolePtr):找到指定位置index元素item的行數row值和角色值。如果index越界了,rowptr值被設定為-1,讓否則將值存到rowPtr和rolePtr中。

   void getLayoutPosition(QLayout *layout,int *rowPtr,ItemRole *rolePtr)

   找到特定的子佈局layout的行號row和role(colume)。如果layout不在formLayout,那麼rowPtr設定為-1,否則正確設定。

   void getWidgetPosition(QWidget *w,int *rowPtr,ItemRole *rolePtr)追溯控制元件w在佈局中的行號row和角色role。如果此佈局沒有w,則rowPtr返回 -1.

   QLayoutItem *itemAt(int index)返回索引為index的控制元件

   QLayoutItem *itemAt(int row,ItemRole role)返回佈局中元素在row行角色是role的控制元件,如果沒有則返回0

   QLayoutItem * QFormLayout::takeAt ( int index )獲取索引為index的元素並刪除原來的元素

   3)插入元素,與addRow對應,只是新增一個引數及int row,指定在某個行之後新增。如果row越界,則自動新增到最後一行。

   setItem(int row,ItemRole role,QLayoutItem *item)將item元素設定到指定的行號row的指定角色role的位置。如果此處的位置已經被佔用了,則插入失敗。

   void setLayout(int row,ItemRole role,QLayout *layout)將指定的layout設定到行row角色為role的位置,根據需要擴充套件沒有行元素的佈局。如果此單元被佔用,則不會插入

   void setWidget(int row,ItemRole,QWidget *widget)將指定的widget設定到行row角色為role的位置,根據需要擴充套件沒有行元素的佈局。如果此單元被佔用,則不會插入

   4)QWidget *labelForField(QWidget *field)返回與field關聯的label控制元件

      QWidget *labelForLayout(QLayout *layout)返回與field關聯的label控制元件

   5)QSize minimumSize()獲取佈局的最小尺寸,對應的有maxmumSize最大尺寸

   6)rowCount()返回此佈局中有多少行

   7)setGeometry(QRect rect)設定佈局的空間大小

   8)void setSpacing(int spacing)設定垂直和水平方向的空間間隔。spacing()返回這個值,前提是horizontal和vertical空間相等

   具體使用見一個簡單的輸入例子:使用者登入資訊視窗

#include<QLabel>

#include<QLineEdit>
#include<QFormLayout>
#include<QPushButton>
voidinitLayout(QWidget&w)
{
QFormLayout*mainFormLayout=newQFormLayout();
mainFormLayout->setSizeConstraint(QLayout::SetFixedSize);
mainFormLayout->setVerticalSpacing(40);
mainFormLayout->setHorizontalSpacing(10);
mainFormLayout->setRowWrapPolicy(QFormLayout::DontWrapRows);
mainFormLayout->setFieldGrowthPolicy(QFormLayout::FieldsStayAtSizeHint);
mainFormLayout->setLabelAlignment(Qt::AlignRight|Qt::AlignVCenter);
mainFormLayout->setFormAlignment(Qt::AlignCenter);
QLineEdit*nameLineEdit=newQLineEdit("enteryourname");
//nameLineEdit->setInputMask("ANNNNNnnnnnnnnnnnnnn");
nameLineEdit->setDragEnabled(true);
nameLineEdit->setAlignment(Qt::AlignCenter);
nameLineEdit->setFrame(false);
nameLineEdit->show();
QLineEdit*pwdLineEdit=newQLineEdit();
pwdLineEdit->setEchoMode(QLineEdit::Password);
pwdLineEdit->setInputMask("XXXXXX");//6-20
pwdLineEdit->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
pwdLineEdit->setDragEnabled(false);
pwdLineEdit->setFrame(true);
pwdLineEdit->show();
QPushButton*buttonOk=newQPushButton("OK");
QObject::connect(buttonOk,SIGNAL(pressed()),nameLineEdit,SLOT(clear()));
QPushButton*buttonCancel=newQPushButton("Cancel");
QObject::connect(buttonCancel,SIGNAL(pressed()),nameLineEdit,SLOT(clear()));
QHBoxLayout*buttonLayout=newQHBoxLayout();
buttonLayout->setSizeConstraint(QLayout::SetFixedSize);
buttonLayout->addWidget(buttonOk);
buttonLayout->addWidget(buttonCancel);
mainFormLayout->addRow("&Name:",nameLineEdit);
mainFormLayout->addRow("&Password:",pwdLineEdit);
mainFormLayout->addRow(buttonLayout);
//mainFormLayout->addRow(buttonOk);
//mainFormLayout->addRow(buttonCancel);
w.setLayout(mainFormLayout);
}
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
FormLayouTestw;
w.resize(1280,720);
initLayout(w);
w.show();
returna.exec();

}

執行結果如下

   2、 QBoxLayout:框佈局,這是最簡單的一種佈局,這種佈局將需要管理的控制元件排成一列或者一行。其實講QBoxLayout佔用的空間分成一行或者一列框,然後把佈局所管理的控制元件填進取。

   此佈局的方向orientation有兩種,水平的即horizontal和垂直的vertical。每一個被放置到框裡面的佈局獲取的大小最小是其minimum大小,最大不超過maxmumSize。任何多餘的空間將根據伸展因子共享處理。如果此佈局不是最頂層佈局,則一定需要將佈局放置到父視窗或者佈局裡面

   為了更快捷的使用,可以使用QHBoxLayout和QVBoxLayout建立指定方向的boxlayout,當然可以根據排列空間的方式不同,使用QBoxLayout建立佈局,其方向主要是水平方向:LeftToRight、RightToLeft;垂直方向:BottonToTop,TopToBottom.

   新增一個box控制元件主要方式如下:

   1)addWidget()新增一個視窗不見widget到QBoxLayout,並且設定此不見得伸縮因子。伸展因子是boxes的行使用。

   2)addSpacing()新增一個空的box。

   3)addStretch()建立一個可伸縮的box

   4)addLayout()將一個包含其他控制元件的佈局新增到box上並設定layout的伸縮因子。同樣有對應的insert方法。

   QBoxLayout有兩個邊界寬度,一個是內容邊界,setContentsMargins,設定每個視窗部件的外部邊距。這是每個QBoxLayout四邊的保留空間

   setSpacing設定兩個相鄰的box之間的間距,可以使用addSpacing獲取更多的空間。

   刪除一個控制元件,使用removeWidget,或者呼叫QWidget::hide()一樣可以從佈局中刪除,知道show被呼叫。

   簡單的講,這個佈局是要注意以下幾點:

   第一,佈局控制元件的排列方式決定了佈局的方向,其主要有兩個佈局,水平和垂直

   第二,佈局各個空間的拉昇,不是所有的控制元件平分佈局的空間,而是根據伸縮因子和顯示比例完成控制元件空間的分配。

   第三,各個控制元件之間的間隔及整個控制元件和佈局的外部邊距大小。這三點決定了此佈局的使用

   2.1 常用的函式

   QBoxLayout::QBoxLayout ( Directiondir, QWidget * parent = 0 )

   建立一個框佈局,dir有TopToBottom,BottomToLeft,LeftToRight及RightToLeft

   void QBoxLayout::addLayout ( QLayout * layout, int stretch = 0 )

   新增一個佈局到框的末尾,設定伸縮因子stretch factor為stretch值,預設為0

   void QBoxLayout::addSpacing ( int size )

   新增一個不能伸縮的空間(一個QSpacerItem),其寬度設定為size到佈局末尾。框佈局提供了預設的邊距margin和spacing,這是額外新增的空間。

   void addStretch(int stretch = 0)

   新增一個可伸縮的空間(一個QSpacerItem),設0為最小值並且伸縮因子為stretch值到佈局末尾

   void addStrut(int size)

   限制垂直尺寸到最小值size,如一個LeftToRight的框佈局的高度。

   void addWidget(QWidget *w,int stretch=0,Qt::Alignment alignment=0)

   新增一個視窗部件到此框佈局的末尾,並設定其伸縮率為stretch和alignment。

   stretch設定為0,並且沒有其他空間有stretch大於0的控制元件,則空間的分配按照預設的值進行分配。alignment被賦值為alignment,預設值為0,表示控制元件將填充整個單元。

   注意此分配因子的工作原理,stretch其實相當於一個佔位符號,其可伸縮在0與stretch值之間,原則就是如果分配完空間有額外的空間,則根據stretch值大小比例去分,如果佈局空間不夠,則會壓縮這個空間以被其他控制元件使用。

   比如有兩個控制元件,在新增的時候第一個控制元件設定為200,第二個設定為0,那麼最後結果是第一個控制元件比第二個控制元件多佔用0-200的空間,如果第二個也設定為200,則兩個伸縮係數一樣的,所以兩個控制元件佔用空間基本一致,如果第二個設定為100,則其空間佔有約以2:1的比例分多餘的空間。

   本質上來講spacing和stretch都是QSpaceItem控制元件,佔用空間用的,只是一個固定的,一個可伸縮的。

   int count()返回此佈局有多少個空間,此值在後續中inset相關的函式中進行使用。

   Direction direction()返回佈局的方向,新增控制元件與伸縮與這個方向一致。

   void insertLayout ( int index, QLayout * layout, int stretch = 0 )

   插入佈局到指定index位置,並設定伸縮因子stretch。如果index是負數,layout新增到末尾。

   void QBoxLayout::insertSpacing ( int index, int size )

   在指定位置插入大小為size空間的不可伸縮的box。次函式常用於在指定位置新增空間。

   void QBoxLayout::insertStretch ( int index, int stretch = 0 )

   在指定位置新增可伸縮的空間,從0到伸縮因子stretch伸縮。

   void QBoxLayout::insertWidget ( int index, QWidget * widget, int stretch = 0,Qt::Alignmentalignment = 0 )

   在指定位置index插入控制元件widget

   QSize minimumSize() QSize maxmumSize()獲取佈局的最大最小空間尺寸

   setDirection()設定方向

   setGeometry(QRect r)設定佈局空間大小尺寸

   setSpacing(int spacing)設定相鄰控制元件的間距。

   setStretch(int index,int stretch)

   設定指定位置的伸縮因子為stretch值

   bool setStretchFactor(QWidget *w,int stretch)設定視窗部件QWidget的伸縮因子為stretch,如果找到此部件返回true,否則返回false

   bool setStretchFactor(QLayout *layout,int stretch)設定子佈局的伸縮因子為stretch,如果找到此佈局返回true,否則返回false

   QSize sizeHint()返回合適的佈局尺寸

   int spacing()如果空間屬性可用,則直接返回,否則需要通過計算後返回。因為佈局間距受視窗控制元件樣式決定。

   int QBoxLayout::stretch ( int index )

   返回index位置的伸縮因子stretch

   注:stretch其實是規定了一個可以伸縮的範圍,在這個範圍內更好的合理的展現佈局,如果空間過大,則此stretch會佔用的多一點,如果空間太少,則會佔用的少一點,addSpacing是新增一個固定大小空間的box,此相當於一個控制元件佔用一個空間,只是不顯示,其佈局在處理的時候不可壓縮這部分空間,舉例如下:

QPushButton*buttonOk=newQPushButton("OK");

QPushButton*buttonCancel=newQPushButton("Cancel");
QBoxLayout*buttonLayout=newQBoxLayout(QBoxLayout::LeftToRight);
buttonLayout->setSizeConstraint(QLayout::SetFixedSize);
buttonLayout->addStretch(10);
buttonLayout->addWidget(buttonOk);

buttonLayout->addStretch(200);

    //buttonLayout->addSpacing(200);
buttonLayout->addWidget(buttonCancel);

buttonLayout->addStretch(10);

   效果如下:


buttonLayout->addStretch(200);       buttonLayout->addSpacing(200);

說明:QSpacerItem是為佈局提供空白空間的類,在addStretch及addSpacing實際上就是處理這些。

   3、QStackedLayout:堆疊佈局,是將一堆widget控制元件放置在一起,只有一個控制元件是能看見的。其不是管理控制元件的尺寸即位置,而是尺寸的顯示,可以被一些字視窗控制元件(頁)在同一空間填充。多用於頁面切換等的操作。但是QStackedWidget並沒有提供一種方法給使用者區切換頁。這種方式就需要藉助QComboBox或者QListWidget去儲存每個頁面的標題,從而配合實現切換頁面。

   當填充佈局的時候,視窗部件widget會載入到內部的一個列表中,通過indexOf()方法返回一個視窗部件widge的索引在內部的列表中。當然widget可以被新增到列表的末尾,或者插入到指定的索引位置。removeWidget()方法刪除在索引序號為index的視窗部件。通過count()方法可以獲取到載入到佈局layout的元素個數。

   widget()方法返回在指定位置上的部件widget,當前螢幕上顯示的的視窗部件的索引序號值可以用使用currentIndex()獲取,並且使用setCurrentIndex()設定。相似的情況,當前的顯示可見的視窗部件可以通過currentWidget獲取到,使用setCurrentWidget()更新。

   但是不管什麼情況,只要當前widget的佈局變了或者remove刪除,則currentChanged()訊號和widgetRemoved()訊號會一次傳送。

   3.1 重要的屬性

   1)count:const int表示佈局layout包含的視窗控制元件的數量,count()訪問。

   2)currentIndex:int,此屬性儲存當前可見視窗部件的index值,如果沒有當前視窗部件則返回-1,使用currentIndex()訪問,setCurrentIndex(int index)進行設定。如果currentIndex改變了,則訊號currentChanged(int index)訊號發射。

   3)stackingMode:StackingMode,此屬性決定子視窗部件可見方式的處理,預設是StackOne,即只有當前視窗是可見的,stackAll表示所有視窗都可見,但是隻是提出了當前視窗。通過stackingMode()訪問,setStackingMode(StackingMode)進行設定

   3.2 重要的函式:

   int addWidget(QWidget *widget)將指定的widget新增到佈局的末尾,並返回對應部件的位置index。如果執行此函式之前QStackedLayout是空,則將此設定為當前視窗部件。

   void currentChanged(int intx)訊號,噹噹前視窗部件改變後發射此訊號。index是最新的部件索引,或則-1,如果沒有一個新的當前啟用的視窗,,如為空時

   QWidget *currentWidget()返回當前視窗部件,如果沒有視窗部件則返回0

   int i當前indensertWidget(int index,QWidget *widget)在QStackedLayout的指定位置index插入widget。如果index越界,則追加到末尾。如果之前layout是空的,則此被設定為當前widget。這種插入的方式,index小於等於當前視窗的currentIndex,則會增加當前的index,但是保留當前活躍的使用者。

   void setCurrentWidget(QWidget *widget)設定當前視窗為指定widget。

   widget(int intdex)返回index邊上的widget或者0,如果沒有這個值則。

   widgetRemoved(int index)視窗被刪除時訊號被髮出。

#include <QApplication>

#include <QLabel>

#include <QStackedLayout>

#include <QDebug>

void initStackedLayout(QWidget &w)

{

QStackedLayout *stackedLayout = new QStackedLayout();

stackedLayout->setStackingMode(QStackedLayout::StackAll);

stackedLayout->setSizeConstraint(QLayout::SetFixedSize);

QLabel *firstPage = new QLabel();

firstPage->setAlignment(Qt::AlignLeft);

firstPage->setWordWrap(true);

firstPage->setText("1111");

QLabel *first1Page = new QLabel();

first1Page->setAlignment(Qt::AlignCenter);

first1Page->setWordWrap(true);

first1Page->setFrame(tue);

first1Page->setText("2222");

QLabel *first2Page = new QLabel();

first2Page->setAlignment(Qt::AlignRight);

first2Page->setWordWrap(true);

first2Page->setText("3333");

qDebug()<<stackedLayout->addWidget(firstPage)<<endl;

qDebug()<<stackedLayout->addWidget(first1Page)<<endl;

qDebug()<<stackedLayout->addWidget(first2Page)<<endl;

stackedLayout->setCurrentIndex(1);

w.setLayout(stackedLayout);

}

int main(int argc,char **argv)

{

QApplication app(argc,argv);

QWidget w;

w.setFixedSize(1280,720);

initStackedLayout(w);

w.show();

return app.exec();

}

這是stackedMode,前者是StackedAll ,後者是StackedOne

   4、QGridLayout:網格佈局,顧名思義就是將所要管理的視窗控制元件放置到一個網格中,也就是一個二維表。所以其有行與列的概念。QGridLayout從其父視窗或者佈局獲取到可用的空間,並分為行和列rows and columns,然後將每個視窗widget放置到對應的單元cell中並管理起來。

   有列,又有行,其兩者的行為是一樣的。所以以列為點先討論。每個列都有一個最小的寬度,還有一個伸縮因子,用於在嗎某個範圍內佔用空用的空閒空間。每個列的最小寬度是由設定setColumnMinimumWidth()和控制元件widget的最小尺寸的相互結果。使用setColumnStretch()設定此列的伸縮引數,其決定了一列多少空間是可以使用的並且在其之上的最小空間是可用的。

   一般來講,每列所管理的控制元件或者佈局可以通過使用addWidget()新增,但是也有可能性就是一個控制元件需要佔用多行,這樣就需要使用行或者列的spanning引數,表示需要佔用的行數或者列數。

   和其他佈局一樣,如果從佈局拿掉一個管理的控制元件,呼叫removeWidget()引數,或者呼叫QWidget的hide函式也可以釋放其佔用的空間。

   4.1 屬性

   1)horizontalSpacing:int 用於保留兩個控制元件之間水平方向的空間,horizontalSpacing獲取,setHorizontalSpacing(int spacing)進行設定。

   2)verticalSpacing : int在垂直方向上兩個控制元件之間的間距,通過verticalSpacing獲取,setVerticalSpacing進行設定

   上兩個屬性如果沒有設定,則繼承子其父類佈局或者控制元件。其和layout本身的spacing關係是如果兩者相等,則使用spacing,否則spacing為-1值

   4.2 主要的函式

   1)addLayout(Qlayout *layout,int row,int column,Qt::Alignment =0)

   layout:需要新增的佈局物件;row column表示要進價進入網格的行列號,top-left位置是(0,0),alignment表示控制元件放置在cell但願的位置,預設為0表示填充整個單元cell。

   2)addLayout(QLayout layout,int row,int column,int rowSpan,int columnSpan,Qt::Alignment = 0)同上面實現一樣的功能,這裡需要注意的就是新增的控制元件佔用多少個單元,跨越多少個單元及rowSpan與columnSpan

   3)addWidget(QWidget *widget,int row,int column,Qt::Alignment =0)

   widget:需要新增的視窗不見;row column表示要進價進入網格的行列號,top-left位置是(0,0),alignment表示控制元件放置在cell但願的位置,預設為0表示填充整個單元cell。

   如果rowSpan與/或者columnspan為-1,則佈局會擴充套件到bottom與/或者right邊界位置。

   4)addWidget(QWidget *widget,int fromrow,int fromcolumn,int rowSpan,int columnSpan,Qt::Alignment = 0)同上面實現一樣的功能,這裡需要注意的就是新增的控制元件佔用多少個單元,跨越多少個單元及rowSpan與columnSpan。如果rowSpan與/或者columnspan為-1,則佈局會擴充套件到bottom與/或者right邊界位置。

   5)QRect cellRect(int row,int column)獲取網格單元在row與column決定的單元的空間尺寸。如果row和column越界,則返回無效的QRect

   6)int columnCount() 獲取columns列的個數。

   同樣有rowCount返回row數

   7)int columnMinimumWidth(int column)獲取指定列的最小寬度,通過setColumnMinimuWidth(int column,int width)設定

   同樣有rowMinimumHeight(int row)獲取某一行的最小高度setRowMinimunHeight(int row,int height)進行設定

   8)int columnStretch(int column)獲取指定列column的拉昇因子,可以用setColumnStretch(int column,int stretch)進行設定

   同樣 int rowStretch(int row)獲取行row的伸縮值,通過setRowStretch(int row,int stretch)設定。

   9)count()返回網格有多少個單元

   10)void getItemPosition(int index,int *row,int *column,int *rowSpan,int *columnspan)

   用於獲取index所制定的元素所在的行列號及水平垂直所佔用的跨越單元個數。

   11)setSpacing()設定網格垂直及水平方向控制元件之間的間隔尺寸。spacing()獲取,如果horizontalSpacing與verticalSpacing不同,返回-1

   綜上所述佈局管理所管理的都是各個控制元件存放的位置及尺寸,以及控制元件拉昇的策略。對控制元件的操作,主要獲取其相關的資訊,如spacing及strech,對於多行這種有行列不同的spacing,則根據具體情況獲取設定。

   根據不同的佈局特點,都添加了新增控制元件及子佈局的介面,也提供了通過index獲取佈局的相關資訊。