• 8993阅读
  • 1回复

【摘录】《KDE2/Qt编程金典》第三章:在窗口中布置部件——3.12 位于其它部件之内的部件(水平方向上) [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-09-09
  因为KContainerLayout是一个部件,并且具有包含其它部件的能力,所以它可以包含其它的KContainerLayout部件。在下面的例子中,一组水平KContainerLayout部件被放置到一个垂直的KContainerLayout部件之中。这个例子也说明了,在创建容器和向其间加入子部件的时候,使用不同的综合选项会产生不同效果。

Main

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

HorizLayout Header

1 /* horizlayout.h */
2 #ifndef HORIZLAYOUT_H
3 #define HORIZLAYOUT_H
4
5 #include <qwidget.h>
6 #include <kcontainer.h>
7 #include <qpushbutton.h>
8
9 class HorizLayout: public QWidget
10 {
11 public:
12 HorizLayout(QWidget *parent=0,const char *name=0);
13 ~HorizLayout();
14 private:
15 void add(KContainerLayout *layout,int count,
16 bool homogeneous,bool expand,bool fill);
17 };
18
19 #endif


HorizLayout

1 /* horizlayout.cpp */
2 #include “horizlayout.h”
3 #include <qlabel.h>
4
5 HorizLayout::HorizLayout(QWidget *parent,const char *name)
6 : QWidget(parent,name)
7 {
8 KContainerLayout *layout = new KContainerLayout(this,
9 NULL,
10 KContainerLayout::Vertical,
11 FALSE,
12 5,
13 0,
14 TRUE);
15
16 int count = 1;
17 add(layout,count++,FALSE,TRUE,TRUE);
18 add(layout,count++,TRUE,TRUE,TRUE);
19 add(layout,count++,FALSE,FALSE,TRUE);
20 add(layout,count++,TRUE,FALSE,TRUE);
21 add(layout,count++,FALSE,TRUE,FALSE);
22 add(layout,count++,TRUE,TRUE,FALSE);
23 add(layout,count++,FALSE,FALSE,FALSE);
24 add(layout,count++,TRUE,FALSE,FALSE);
25
26 layout->sizeToFit();
27 }
28 void HorizLayout::add(KContainerLayout *outer,int count,
29 bool homogeneous,bool expand,bool fill)
30 {
31 QPushButton *button;
32
33 QString str(tr(“%1. “).arg(count));
34 if(homogeneous)
35 str.append(“Homogeneous”);
36 else
37 str.append(“Non-homogeneous”);
38 if(expand)
39 str.append(“, expand”);
40 else
41 str.append(“, no-expand”);
42 if(fill)
43 str.append(“, fill”);
44 else
45 str.append(“, no-fill”);
46
47 QLabel *label = new QLabel(str,outer);
48 label->setMinimumSize(label->sizeHint());
49 outer->packStart(label);
50
51 KContainerLayout *inner = new KContainerLayout(outer,
52 NULL,
53 KContainerLayout::Horizontal,
54 homogeneous,
55 5,
56 0,
57 TRUE);
58
59 button = new QPushButton(inner);
60 button->setText(“ONE”);
61 button->setMinimumSize(button->sizeHint());
62 inner->packStart(button,expand,fill);
63
64 button = new QPushButton(inner);
65 button->setText(“BUTTON TWO”);
66 button->setMinimumSize(button->sizeHint());
67 inner->packStart(button,expand,fill);
68
69 button = new QPushButton(inner);
70 button->setText(“THREE”);
71 button->setMinimumSize(button->sizeHint());
72 inner->packStart(button,expand,fill);
73
74 inner->sizeToFit();
75 outer->packStart(inner);
76 }
77 HorizLayout::~HorizLayout() { }


  在第8行创建了垂直方向的KContainerLayout,它作为顶层窗口的容器。从第17行到第24行,每调用一次add(),就向顶层的KContainerLayout增加一个标签和一个水平方向的KContainerLayout容器,为了在水平容器中定位部件,存在3个基本的开关选择设置,也就是存在着8种可能的组合方式,其中的每一种都调用一次add()。add()的第1个参数指的是容器部件,第2个参数是安排给显示数据的序号,其它3个参数是开关方式的设置参数,这3个参数可以控制部件的位置。
  从第28行开始的add()方法,创建了一个起描述作用的标签和一个水平KContainerLayout部件然后将其加入到作为第1个参数的KContainerLayout部件中。方法一开始创建了一个描述选项设置的QString对象,此字符串结构从第33行开始,实现数字到字符的转换。第34行到第35行分别对三个Boolean设置中的每一个和相应的附加文本进行了测试。在第47行,这个字符串被用来构造一个QLabel对象;然后,在第49行,标签被放置到KContainerLayout主窗口的顶部。
  第51行到第57行创建了一个水平容器,值得注意的是,在第51行,将要包含这个水平容器的KContainerLayout被命名为父部件。在第53行,不是设定名称,而是设置为水平方向。无论部件的大小和位置是什么,都在第54行依照传递给此方法的参数来设置homogeneous。第59行到第72行创建了三个按钮,并将它们加入到水平KContainerLayout widget中。其它两项配置,expand和fill,在packStart()中使用,用此方法将按钮加入到容器中。
  尽管每个按钮都在创建时将它的容器作为它的父类,但还必须将它们加入到容器中以便能够显示。这样做是必要的,因为需要在部件的层次结构间上下传递信息,在按钮和它的容器之间能够进行信息交互。然后,在第67行,按钮被加入到容器的开始端,这样就指定了它在容器中的专门位置。利用这两种关系,容器就可以从按钮中提取大小信息,计算这个按钮实际填充的大小和位置,并且向按钮返回必要的信息。
  第3个设置——homogeneouse、expand以及fill,都用于安排部件在容器中的位置和大小,它们都代表着略微不同的含义。
homogeneusous:
  如果值为TRUE,那么容器中所有的部件都将被设置为同样的大小。这个选项设置不考虑部件实际的大小。如果值为FALSE,每个部件将决定各自不同的大小需求,这样各个部件很可能表现为不同的大小。无论是TRUE还是FALSE,窗口的扩大或者缩小都将带动部件随着所分配的区域空间扩大和缩小

expand:
  如果值为TRUE,部件将占用容器分配给它的全部空间
fill:
  如果expand的值为TRUE,那么设置fill的值为TRUE会使得部件改变自己的大小,以使充满容器分配给它的全部空间。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线yangfanxing
只看该作者 1楼 发表于: 2010-03-17
BZ辛苦。。。
PHPWind好恶心。。。不想看这种界面。。。
快速回复
限100 字节
 
上一个 下一个