使用QGridLayout对象可以定义水平和垂直的不可见的栅格线,将部件插入到这些线组成的单元中。下面的例子创建了一个栅格,有5个栅格单元的宽度和高度,在4个单元格中插入按钮。
1       /* main.cpp */
2       #include <kapp.h>
3       #include "fivebyfive.h"
4
5       int main(int argc, char **argv)
6       {
7              KApplication app(argc, argv, "fivebyfive");
8              FiveByFive *fivebyfive = new FiveByFive();
9              fivebyfive->show();
10              app.setMainWidget(fivebyfive);
11              return(app.exec());
12       }
  主程序创建了一个FiveByFive的部件实例,将它作为在KApplication窗口中显示的部件。
1       /* fivebyfive.h */
2       #ifndef FIVEBYFIVE_H
3       #define FIVEBYFIVE_H
4
5       #include <qwidget.h>
6       #include <qpushbutton.h>
7       
8       class FiveByFive: public QWidget
9       {
10       public:
11              FiveByFive(QWidget *parent = 0, const char *name = 0);
12              ~FiveByFive();
13       private:
14              QPushButton *b11;
15              QPushButton *b31;
16              QPushButton *b13;
17              QPushButton *b33;
18       };
19
20       #endif
  头文件定义了FiveByFive类,以QWidget为父类,包含了4个按钮,摆放在栅格中。
1       /* fivebyfive.cpp */
2       #include <qlayout.h>
3       #include "fivebyfive.h"
4       
5       FiveByFive::FiveByFive(QWidget *parent, const char *name)
6              : QWidget(parent, name)
7       {
8              QGridLayout *layout = new QGridLayout(this, 5, 5);
9
10              b11 = new QPushButton("(1,1)", this);
11              b11->setMaximumSize(100, 100);
12              layout->addWidget(b11, 1, 1);
13              b13 = new QPushButton("(1,3)", this);
14              b13->setMaximumSize(100, 100);
15              layout->addWidget(b13, 1, 3);
16              b31 = new QPushButton("(3,1)", this);
17              b31->setMaximumSize(100, 100);
18              layout->addWidget(b21, 3, 1);
19              b33 = new QPushButton("(3,3)", this);
20              b33->setMaximumSize(100, 100);
21              layout->addWidget(b33, 3, 3);
22              for (int i = 0; i < 5; i++)
23              {
24                     layout->addRowSpacing(i, 60);
25                     layout->addColSpacing(i, 60);
26              }
27              resize(10, 10);
28
29              layout->activate();
30       }
31
32       FiveByFive::~FiveByFive(){}
  在第2行包含了qlayout.h头文件,这个头文件也被用来定义QVBoxLayout和QHBoxLayout,在本章的后面将做进一步介绍。
  在第8行,QGridLayout对象创建为5个单元格宽,5个单元格高,左上角的单元格命名为(0,0),右边紧挨着的为(0,1),下一个为(0,2),依此类推定义所有的单元格。将部件定位到栅格中,使得它离栅格窗口的左边间隔一个单元格,距离上端间隔一个单元格,这样它被放到栅格单元(1,1)中。
  第10行和第11行创建了一个按钮,将它们的最大高度和最大宽度都设置为100像素点。这样,只要单元格小于100x100像素点,那么按钮就将扩充到整个单元格中。通常,按钮不能扩展超出它内部的最大值设置。
  第10行、第11行和第12行用标签"(1,1)"创建了按钮,并把它放置在(1,1)单元格的位置上。第11行调用setMaximumSize()允许按钮扩充它所占的单元格。sizeHint()方法对于很多部件来说是有效的,但不是对全部的部件都有效。在这个例子的情况下,程序正确地认为QPushButton部件返回了一个有效的暗示大小的值,因此在使用前不用进行有效性测试。一般情况下程序的代码应该像下面这样:
       QSize *qsize = b11.sizeHint();
       if (qsize.isValid())
              b11.setMinimumSize(qsize);
       else
              b11.setMinimumSize(30, 30);
  在上面这种情况下,如果部件测试没有返回一个有效的大小设置,那么某些合理的设置将被使用。虽然默认的设置相当好,但是它们几乎都不是你所想要的。
  注意:当编写自己的部件时,可能发现使用sizeHint()是很有用的。这个方法在QWidget中定义为一个实际使用的函数,除非重载它,否则它总是返回一个无效的QSize。
  第23到第26行循环调用addRowSpacing(),设置栅格中的每一行和每一列。设置了每一列的最小宽度和每一行的最小高度,都为60像素点,没有设置最大值,这样每一行和每一列可以扩大到任意大小,如果改变窗口的大小,那么将会看到按钮也同时改变。
  在第27行调用的resize()是请求将整个部件缩小为10x10个像素点。这个部件不能实现这个请求,因为行和列都有最小值设置。无论什么时候进行部件大小的调整,只要新的宽度和高度值超出了最大值和最小值定义的范围,那么新给定的值都将被忽略,而使用最接近的有效值——也就是说,使用最大值或者最小值。在这个例子中,部件将简单地缩小为它的最小值。