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
本文作者:黃邦勇帥(原名:黃勇)