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
在这里插入图片描述

本文作者:黄邦勇帅(原名:黄勇)

猜你喜欢

转载自blog.csdn.net/hyongilfmmm/article/details/83029184
今日推荐