• 8157阅读
  • 1回复

【摘录】《KDE2/Qt编程金典》第三章:在窗口中布置部件——3.5 部件占据多个栅格单元 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-09-03
  尽管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行针对所有单元格指定的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线mathbox

只看该作者 1楼 发表于: 2006-10-14
哦,明白了,呵呵,顶下天呐,感谢斑竹
快速回复
限100 字节
 
上一个 下一个