下面的例子使用了QGridLayout对象来定位4个按钮,设置了一些行和列的拉伸值使得在父窗口改变大小的情况下控制按钮的缩放。
1 /* main.cpp */
2 #include <kapp.h>
3 #include "fourbyfour.h"
4
5 int main(int argc,char **argv)
6 {
7 KApplication app(argc, argv, "fourbyfour");
8 FourByFour *fourbyfour = new FourByFour();
9 fourbyfour->show();
10 app.setMainWidget(fourbyfour);
11 return app.exec();
12 }
主程序创建了FourByFour的部件实例,将它作为KApplication窗口中显示的部件。
1 /* fourbyfour.h */
2 #ifndef FOURBYFOUR_H
3 #define FOURBYFOUR_H
4
5 #include <qwidget.h>
6 #include <qpushbutton.h>
7
8 class FourByFour::public QWidget
9 {
10 public:
11 FourByFour(QWidget *parent = 0, const char *name = 0);
12 ~FourByFour();
13 private:
14 QPushButton *b11;
15 QPushButton *b21;
16 QPushButton *b12;
17 QPushButton *b22;
18 };
19
20
21 #endif
头文件定义了FourByFour类,以QWidget为父类,它以私有数据的方式包含了4个按钮,放置在单元格中调整大小。
1 /* fourbyfour.cpp */
2 #include <qlayout.h>
3 #include "fourbyfour.h"
4
5 FourByFour::FourByFour(QWidget *parent, const char *name)
6 : QWidget(parent, name)
7 {
8 QGridLayout *layout = new QGridLayout(this, 4, 4);
9 QSize buttonMax(400, 400);
10
11 b11 = new QPushButton(this);
12 b11->setText("(1,1)");
13 b11->setMinimumSize(b11->sizeHint());
14 b11->setMaximumSize(buttonMax);
15 layout->addWidget(b11, 1, 1);
16 b12 = new QPushButton(this);
17 b12->setText("(1,2)");
18 b12->setMinimumSize(b12->sizeHint());
19 b12->setMaximumSize(buttonMax);
20 layout->addWidget(b12, 1, 2);
21 b21 = new QPushButton(this);
22 b21->setText("(2,1)");
23 b21->setMinimumSize(b21->sizeHint());
24 b21->setMaximumSize(buttonMax);
25 layout->addWidget(b21,2,1);
26 b22 = new QPushButton(this);
27 b22->setText("(2,2)");
28 b22->setMinimumSize(b22->sizeHint());
29 b22->setMaximumSize(buttonMax);
30 layout->addWidget(b22,2,2);
31
32 layout->addRowSpacing(0,20);
33 layout->addRowSpacing(3,20);
34 layout->addRowSpacing(0,20);
35 layout->addRowSpacing(3,20);
36 resize(10,10);
37
38 layout->setRowStretch(2,100);
39 layout->setColStretch(2,100);
40
41 layout->activate();
42 }
43
44 FourByFour::~FourByFour(){}
在第8行创建了QGridLayout对象,为4个单元格宽、4个单元格高。第11行到第30行创建了4个QPushButton对象,并且将这4个按钮放置到栅格中的4个单元格中。每个按钮的最小值设置能够保证文本总是可见的。每个按钮的最大值任意设置为一个巨大的数字,保证QGridLayout可以拉伸按钮使得按钮充满整个单元格。
在第32行到第35行调用了addRowSpacing()和addColSpacing(),将左边和右边两列的宽度以及上边和下边两行的高度都设置为20个像素点。这样的结果是,应用程序窗口的边缘为20个像素点宽,而中间的4个单元格包含了4个按钮。在第36行的调用resize()试图将部件的大小减小到比它所允许的最小值还小,所以这个部件最初的显示的是它的最小尺寸。
在第38行调用setRowStretch(),将第3行(按钮的第2行)的拉伸系数(stretch factor)设置为100。在第34行的调用setColStretch()将第3列(按钮的第2列)的拉伸系数设置为100。无论何时改变窗口的大小,不管在水平方向还是在垂直方向,具有较大拉伸系数的行和列将比拉伸系数小的改变大得多。
对于每一行和列来说,默认的拉伸系数是0。如果所有的行(或者列)的拉伸系数都设置为0,那么所有的行(或者列)可能会也可能不会改变大小,这样的结果当然不是用户所想要的。当栅格大小改变时,只有那些具有非零拉伸系数的行和列才随着改变大小。某行或者列的拉伸系数相对于所有被改变的单元格的拉伸系数总和的比率决定了该行或者该列改变的程度。
在这个例子中,第1行和第1列的拉伸系数仍保持为零,所以左上角的按钮没有改变,相反,第2列和第2行的拉伸系数都不为零,所以在下边和右边的按钮在水平和垂直两个方向上都改变了。
单元格实际拉伸的程度是由此单元格的拉伸系数相对于所有单元格在拉伸方向的拉伸系数的总和的比率决定的。例如,改变FourByFour的各个拉伸系数,可以使得所有的按钮都改变大小,然而可能一些改变得快些,另一些改变得慢些。为了实现这种效果,用下面的代码行替代第38行和第39行:
layout->setRowStretch(1, 50);
layout->setRowStretch(2, 100);
layout->setColStretch(1, 9);
layout->setColStretch(2,1);
这样设置之后,在垂直方向上拉伸窗口,第2行的改变是第1行的两倍。在水平方向上拉伸窗口,第1列的改变将是第2列的9倍。