• 8736阅读
  • 2回复

【摘录】《KDE2/Qt编程金典》第三章:在窗口中布置部件——3.6 垂直框布局和 3.7 水平框布局 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-09-04
  可以将一组部件插入到一个QVBoxLayout对象中,这样就可以将这些部件按照垂直列的方式排列起来。第一个插入的显示在框的上边,第二个插入的紧挨着显示在第一个的下边,这样一个挨着一个,最后加入的显示在列表的最下端。下面的例子将5个按钮(同时伴随着一些间隔和拉伸控制)插入到一个垂直框中。
Main

1 /* main.cpp */
2 #include <kapp.h>
3 #include “verticalbox.h”
4
5 int main(int argc,char **argv)
6 {
7 KApplication app(argc,argv,”verticalbox”);
8 VerticalBox *verticalbox = new VerticalBox();
9 verticalbox->show();
10 app.setMainWidget(verticalbox);
11 return(app.exec());
12 }


  将一个VirticalBox对象作为应用程序窗口显示的部件。
VerticalBox Header

1 /* verticalbox.h */
2 #ifndef VERTICALBOX_H
3 #define VERTICALBOX_H
4
5 #include <qwidget.h>
6 #include <qlayout.h>
7 #include <qpushbutton.h>
8
9 class VerticalBox: public QWidget
10 {
11 public:
12 VerticalBox(QWidget *parent=0,const char *name=0);
13 ~VerticalBox();
14 private:
15 QPushButton *buttonOne;
16 QPushButton *buttonTwo;
17 QPushButton *buttonThree;
18 QPushButton *buttonFour;
19 QPushButton *buttonFive;
20 };
21
22 #endif


VerticalBox

1 /* verticalbox.cpp */
2 #include “verticalbox.h”
3
4 VerticalBox::VerticalBox(QWidget *parent,const char *name)
5 : QWidget(parent,name)
6 {
7 QVBoxLayout *layout = new QVBoxLayout(this,5);
8 QSize buttonMaximum(400,400);
9
10 buttonOne = new QPushButton(this);
11 buttonOne->setText(“BUTTON ONE”);
12 buttonOne->setMinimumSize(buttonOne->sizeHint());
13 buttonOne->setMaximumSize(buttonMaximum);
14 layout->addWidget(buttonOne);
15
16 buttonTwo = new QPushButton(this);
17 buttonTwo->setText(“BUTTON TWO”);
18 buttonTwo->setMinimumSize(buttonTwo->sizeHint());
19 buttonTwo->setMaximumSize(buttonMaximum);
20 layout->addWidget(buttonTwo,30);
21
22 layout->addSpacing(20);
23
24 buttonThree = new QPushButton(this);
25 buttonThree->setText(“BUTTON THREE”);
26 buttonThree->setMinimumSize(buttonThree->sizeHint());
27 buttonThree->setMaximumSize(buttonMaximum);
28 layout->addWidget(buttonThree);
29
30 layout->addStretch(30);
31
32 buttonFour = new QPushButton(this);
33 buttonFour->setText(“BUTTON FOUR”);
34 buttonFour->setMinimumSize(buttonFour->sizeHint());
35 buttonFour->setMaximumSize(buttonMaximum);
36 layout->addWidget(buttonFour);
37
38 layout->addSpacing(5);
39 layout->addStretch(10);
40
41 buttonFive = new QPushButton(this);
42 buttonFive->setText(“BUTTON FIVE”);
43 buttonFive->setMinimumSize(buttonFive->sizeHint());
44 buttonFive->setMaximumSize(buttonMaximum);
45 layout->addWidget(buttonFive);
46
47 resize(10,10);
48 layout->activate();
49 }
50 VerticalBox::~VerticalBox() { }

  在第7行创建的类是基于QVBoxLayout对象的部件。析构函数的第2个参数指定了其中包含的所有项周围都插入5个像素点的边框。如果边框设置为零(默认为零),那么这些项就会一个一个紧挨着显示。
  第10行到第14行创建了一个按钮,设置了它的文本和最小尺寸,将它加入到布局中。它的最大尺寸设置为一个较大的值使得它能够随着QVBoxLayout对象大小的改变而改变。它是加入的第1个按钮,所以会显示在最上边。
  第16行到第20行创建了第二个按钮,并把它加入到布局中。第一个和第二个按钮之间的距离是10个像素点(第一个按钮的边框5加上第二个按钮的边框5)。当布局被拉伸时它们之间的距离也不会改变。在第20行,当按钮被加入到垂直框中时指定了拉伸系数为30,这样在整个布局改变大小时第2个按钮也跟着改变。
  第22行在第二个按钮下插入了20像素点的间隔。接着,在第24行到第28行,创建了第3个按钮,并加入到布局中。这样在第2个按钮和第3个按钮之间将一直保持30像素点宽(两个5个像素点的边框加上20个像素点的间隔)。
  第30行在第三个按钮下边加入了一个拉伸系数为30的拉伸点,然后第32行到第36行在拉伸点的下面插入了第4个按钮。当布局显示在最小尺寸的时候,在第3个按钮和第4个按钮之间并没有因为增加拉伸点而加入间隔。然而,当窗口被垂直拉伸的时候,在第三个和第四个之间显示出了间隔。
  第38行代码在第四个按钮下面插入了5个像素点宽的间隔,设置拉伸系数为10.然后第41行到第45行又接着创建并插入了第5个按钮。这样,在第4个按钮和第5个按钮之间的最小间隔是15个像素点(两个5个像素点的边框加上5个像素点的间隔)。
  前面已经说过拉伸的程度是每个拉伸系数相对于所有拉伸系数之和的比率。这个例子中指定的拉伸系数有30、30,以及10.拉伸系数的总和是70;由此,当窗口的尺寸改变时,第二个按钮将占窗口改变尺寸的3/7,在第三个按钮和第四个按钮之间的间隔将占3/7,而第4个按钮和第5个按钮之间的间隔将占1/7.
  第47行将布局的最初尺寸缩小为它的最小值。布局通过将它所包含的部件和间隔的最小值加起来得到它的最小值。第48行激活了布局,使得无论父窗口是否显示,它都将显示出来。

  水平框布局和垂直框布局的道理是一样的,只不过部件是在水平方向上从左到右一个一个排列起来,而不是从上到下的排列。

  7 QHBoxLayout *layout = new QHBoxlayout(this, 5)


  按钮的名字变得短一些,眼窝窗口不能太宽。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线cottontang2

只看该作者 1楼 发表于: 2006-03-04
Re:【摘录】《KDE2/Qt编程金典》第三章:在窗口中布置部件——3.6 垂直框布局和
上面的一些文件中的双引号用到了中文输入法,望大家注意
离线cottontang2

只看该作者 2楼 发表于: 2006-03-04
Re:【摘录】《KDE2/Qt编程金典》第三章:在窗口中布置部件——3.6 垂直框布局和
"在第7行创建的类是基于QVBoxLayout对象的部件。析构函数的第2个参数指定了其中包含的所有项周围都插入5个像素点的边框

上面这句话中的"析构函数"应为"构造函数"
快速回复
限100 字节
 
上一个 下一个