使用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个像素点。这个部件不能实现这个请求,因为行和列都有最小值设置。无论什么时候进行部件大小的调整,只要新的宽度和高度值超出了最大值和最小值定义的范围,那么新给定的值都将被忽略,而使用最接近的有效值——也就是说,使用最大值或者最小值。在这个例子中,部件将简单地缩小为它的最小值。