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