1. 程式人生 > >Qt佈局管理(4):網格佈局(QGridLayout類)

Qt佈局管理(4):網格佈局(QGridLayout類)

Qt佈局管理(4):網格佈局(QGridLayout類)

若對C++語法不熟悉,建議參閱《C++語法詳解》一書,電子工業出版社出版

1、網格佈局原理(見圖5-17):
基本原理是把視窗劃分為若干個單元格,每個子部件被放置於一個或多個單元格之中,各單元格的大小可由拉伸因子和一行或列中單元格的數量來確定,若子部件的大小(由sizeHint()確定)小於單元格,則可以設定該子部件位於單元格的什麼位置(頂部、左側、底部等),還可設定該子部件是否可以拉伸以填滿該單元格等等。前文講的QBoxLayout佈局就可以看成是隻有一行或一列的網格佈局。
在這裡插入圖片描述
2、QGridLayout類中的屬性

   horizontalSpacing:int	訪問函式:int horizontalSpacing() const; void setHorizontalSpacing(int spacing);    verticalSpacing:int	訪問函式:int verticalSpacing()const;  void setVerticalSpacing(int spacing);

以上屬性用於獲取或設定垂直和水平方向子部件之間的間距。以上屬性其實設定的是spcing屬性(注意:不是QSpacerItem),佈局不會為這些間距分配索引號。

3、QGridLayout類中的函式

①、QGridLayout();
	QGridLayout(QWidget* parent);   //建構函式
②、void addLayout(QLayout* layout, int row, int column,Qt::Alignment alignment = Qt::Alignment());
    void addLayout(QLayout* layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment());
 	void addWidget(QWidget* widget, int row, int column,Qt::Alignment alignment = Qt::Alignment());
   	void addWidget(QWidget* widget, int row, int column, int rowSpan, int columnSpan,Qt::Alignment alignment = Qt::Alignment());
    void addItem(QLayoutItem* item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt::Alignment alignment = Qt::Alignment());

以上函式表示,在(row,column)單元格新增一個跨越rowSpan行columnSpan列單元格的專案(layout、widget或item),其對齊方式為alignment。若rowSpan或columnSpan為−1,則將item分別擴充套件至底部或右側邊緣。預設對齊方式為0,表示部件會填充整個單元格,非零對齊方式不應增長以填充可用空間。左上角為第0行0列。注:addItem是向QGridLayout佈局中新增QSpacerItem間距的方法。

③、int columnCount() const;     		//返回列數
        int rowCount() const;      		 	//返回行數
④、int columnMinimumWidth(int column) const;   	//返回column列最小寬度
   void setColumnMinimumWidth(int column, int minSize); //把column列的最小寬度設定為minSize畫素。
   int rowMinimumHeight(int row) const;    		//返回row行的最小高度。
   void setRowMinimumHeight(int row, int minSize);  //把row行的最小高度設定為minSize畫素。
⑤、int columnStretch(int column) const;    			//返回column列的拉伸因子
   void setColumnStretch(int column, int stretch);  	//把column列的拉伸因子設定為stretch。
   int rowStretch(int row) const;    				//返回row行的拉伸因子。
   void setRowStretch(int row, int stretch);			//把row行的拉伸因子設定為stretch。
⑥、void setSpacing(int spacing);  				//把垂直和水平間距都設定為spacing
    int spacing() const;   						//若垂直和水平間距相等,則返回該值,否則返回−1。

以上兩函式設定的是spcing屬性,它不是一個QSpacerItem。

⑦、Qt::Corner originCorner() const;    			//返回用於網格原點的角落
   void setOriginCorner(Qt::Corner corner);   		//把corner設定為網格的原點位置,即(0,0);

以上兩個函式用於設定原點位於佈局的哪個角落(左上角(預設)、右下角等),其原理見圖5-18所示,其中Qt::Corner列舉對角落進行了描述,詳見章末的表5-17。
在這裡插入圖片描述

⑧、QRect cellRect(int row, int column) const;
 	返回(row, column)處單元格的幾何形狀。若row或column在網格外,則返回無效的矩形。
⑨、void getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan) const;
	返回索引為index的專案的位置資訊。比如
		int i,j, k ,h;		getItemPosition(1, &i,&j,&k,&h); 
		假設i=0,j=1,k=1,h=3,則表示索引為1的專案位於第0行第1列,佔據1行3列。
⑩、QLayoutItem* itemAtPosition(int row, int column) const;
 	返回(row,column)處佈局中的專案。若單元格為空,則返回0。
⑪、virtual int count() const;    			//虛擬函式,QLayout::count()的重新實現,返回佈局中的專案數
⑫、virtual QLayoutItem takeAt(int index);  	//虛擬函式,
	QLayout::takeAt()的重新實現。從佈局中刪除索引index處的專案,並返回該專案
⑬、virtual QLayoutItem* itemAt(int index) const;   //虛擬函式,QLayout::itemAt()的重新實現
	返回指定索引index處的專案,若沒有這樣的專案,則返回0。

示例5.10:QGridLayout(網格佈局)的使用

#include<QtWidgets>
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){    QApplication a(argc,argv);
    QWidget w;			QPushButton *pb,*pb1,*pb2,*pb3,*pb4,*pb5,*pb6;
    pb=new QPushButton("AAA");   	 pb1=new QPushButton("BBB");    pb2=new QPushButton("CCC");
    pb3=new QPushButton("DDD");    pb4=new QPushButton("EEE");
    pb5=new QPushButton("FFF");    pb6=new QPushButton("GGG");
    QGridLayout *pg=new QGridLayout;
    pg->setVerticalSpacing(22);   //設定各子部件之間的垂直間距,不會為該間距分配索引。
    pg->addWidget(pb,0,0,1,1);  //把按鈕pb新增到第0行0列,該按鈕佔據1行和1列單元格。
    pg->addWidget(pb1,0,1,1,1);
    pg->addWidget(pb2,1,0,1,3);  //該按鈕佔據3列單元格的寬度
    pg->addWidget(pb3,2,0,1,1,Qt::AlignBottom|Qt::AlignLeft);  //pb3在其單元格內左下對齊
    pg->addWidget(pb4,2,1,1,1);	   pg->addWidget(pb5,2,2,1,1,Qt::AlignTop|Qt::AlignRight);
    pg->addWidget(pb6,3,0,1,1);
    w.setLayout(pg);
    pg->setRowMinimumHeight(2,66);  //把第2行的最小高度設定為66畫素
    pg->setColumnMinimumWidth(0,111);  //把第0列的最小寬度設定為111畫素
    cout<<pg->columnCount()<<endl;  //輸出列數,本例為3
    cout<<pg->rowCount()<<endl;     //輸出行數,本例為4。
    cout<<pg->rowMinimumHeight(2)<<endl;  //輸出第2行的最小高度66
    cout<<pg->columnMinimumWidth(0)<<endl; //輸出第0列的最小寬度111
    int i,j,k,l;
    pg->getItemPosition(2,&i,&j,&k,&l);  //獲取索引為2(本例為pb3)的子部件的位置資訊。
    cout<<i<<","<<j<<","<<k<<","<<l<<endl; /*輸出(1,0,1,3),即該部件位於第1行第0列,佔據1行3列的單元格大小。*/
    w.show();    return a.exec();  }

執行結果及說明見圖5-19
在這裡插入圖片描述

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