尽管QGridLayout可以很容易地用来在矩形阵列中定位部件(类似于一块西洋跳棋盘)但是也很有可能一个部件占用两个甚至多个栅格单元,这时需要更多的灵活性。下面的例子让一个标签显示在窗口的上边,一个下拉列表框占据6个单元格。
1 /* main.cpp */
2 #include <kapp.h>
3 #include "multicell.h"
4
5 int main(int argc, char **argv)
6 {
7 KApplication app(argc, argv, "multicell");
8 MultiCell *multicell = new MultiCell();
9 multicell->show();
10 app.setMainWidget(multicell);
11 return app.exec();
12 }
1 /* multicell.h */
2 #ifndef MULTICELL_H
3 #define MULTICELL_H
4
5 #include <qwidget.h>
6 #include <qpushbutton.h>
7 #include <qlabel.h>
8 #include <qlistbox.h>
9
10 class MultiCell: public QWidget
11 {
12 public:
13 MultiCell(QWidget *parent = 0, const char *name = 0);
14 ~MultiCell();
15 private:
16 QLabel *label;
17 QListBox *listbox;
18 QPushButton *addButton;
19 QPushButton *deleteButton;
20 QPushButton *cancelButton;
21 };
22
23 #endif
在第16行到第20行,不同部件的存储被定义为MultiCell类的一部分。这样就必须有一个包含这些部件定义的包含文件,在第6行到第8行包含了这些文件。
注意:尽管在类定义中包含所有部件的指针是相当有用的,但是并不总需要这样做。一旦设置了一个用于显示的部件,那么除非需要特殊的东西,否则不必让程序中保留这个部件的指针。例如,如果程序想要改变标签中的文本或者向列表框中加入成员,那么需要使用这些指针。就我个人而言,喜欢在类中以文档的形式包含部件。
1 /* multicell.cpp */
2 #include <qlayout.h>
3 #include <stdio.h>
4 #include "multicell.h"
5
6 MultiCell::MultiCell(QWidget *parent, const char *name)
7 : QWidget(parent, name)
8 {
9 QGridLayout *layout = new QGridLayout(this, 4, 2, 20);
10
11 label = new QLabel("A list box with three buttons",
12 this);
13 label->setMinimumSize(label->sizeHint());
14 label->setAlignment(AlignHCenter);
15 layout->addMultiCellWidget(label, 0, 0, 0, 1);
16
17 listbox = new QListBox(this);
18 for (int i = 0; i < 20; i++) {
19 char str[40];
20 sprintf(str, "Selection %d\n", i);
21 listbox->insertItem(str);
22 }
23 listbox->setMinimumWidth(120);
24 layout->addMultiCellWidget(listbox, 1, 3, 0, 0);
25
26 addButton = new QPushButton(this);
27 addButton->setText("Add");
28 addButton->setMinimumSize(addButton->sizeHint());
29 layout->addWidget(addButton, 1, 1);
30
31 deleteButton = new QPushButton(this);
32 deleteButton->setText("Delete");
33 deleteButton->setMinimumSize(deleteButton->sizeHint());
34 layout->addWidget(deleteButton, 2, 1);
35
36 cancelButton = new QPushButton(this);
37 cancelButton->setText("Cancel");
38 cancelButton->setMinimumSize(cancelButton->sizeHint());
39 layout->addWidget(cancelButton, 3, 1);
40
41 resize(10, 10);
42 layout->activate();
43 }
44
45 MultiCell::~MultiCell(){}
在第9行中,QGridLayout被构建成4个单元格高、2个单元格宽。此外,边缘值20是用来在所有的单元格间插入间隔。
第11行到第14行定义了标签和它的文本,设置了最小尺寸,并且设置了对齐方式使得文本将以居于水平中心的方式显示。在第15行,调用addMultiCellWidget(),将标签设置为占据两个单元格。前两个参数指定行的范围,后两个参数指定列的范围,像下面这样:
startRow, endRow, startCol, endCol
第17行到第24行创建了一个列表框,有20个输入,它的最小宽度设置为120像素点。在第24行调用addMultiCellWidget()指定列表框占用了6个单元格——2个单元格宽乘3个单元格高。
第26行到第29行在窗口右边创建了3个按钮,每一个按钮占据一个单元格。按钮被20个像素点的间隔分隔开来,这是在第9行针对所有单元格指定的。