可以通过调用assignMainWidget()为QApplication对象设计部件,此部件将被QApplication对象以应用程序主窗口的形式显示出来。为了显示一个包含不止一项的主窗口,需要创建自己的部件,把它作为主窗口显示并使用。下面的例子把两个按钮和一个标签组合到一个部件中:
1 /* threewidget.h */
2 #ifndef THREEWIDGET_H
3 #define THREEWIDGET_H
4
5 #include <qpushbutton.h>
6 #include <qlabel.h>
7
8 class ThreeWidget: public QWidget
9 {
10 public:
11 ThreeWidget(QWidget *parent=0, const char *name=0);
12 private:
13 QPushButton *topButton;
14 QPushButton *bottomButton;
15 QLabel *label;
16 };
17
18 #endif
第5行和第6行包含定义了部件的头文件,这些部件将作为复合部件的一部分来使用。这里将要用到两个按钮和一个标签,在threewidget.h文件中的第13行到第15行,把这两个按钮和一个标签的地址定为私有数据。
1 /* threewidget.cpp */
2 #include "threewidget.h"
3
4 ThreeWidget::ThreeWidget(QWidget *parent, const char *name):
5 QWidget(parent, name)
6 {
7 setMinimumSize(120, 180);
8 setMaximumSize(120, 180);
9
10 topButton = new QPushButton("Top Button", this);
11 topButton->setGeometry(15, 15, 90, 40);
12 label = new QLabel("Middle Label", this);
13 label->setGeometry(15, 70, 90, 40);
14 label->setAlignment(AlignVCenter | AlignHCenter);
15 bottomButton = new QPushButton("Bottom Button", this);
16 bottomButton->setGeometry(15, 125, 90, 40);
17 }
因为需要成为一个可显示的部件,所有ThreeWidget类使用了QWidget作为它的基类。
第7行和第8行设置了这个部件的最大值和最小值。父窗口将查询这个部件以决定它自己的大小。在这个例程中,最大值和最小值的设置是相同的,这样表明这个窗口是不可变的,不能用鼠标改变它的宽度和高度。
上部的按钮是在第10行创建的,构造函数的第2个参数是将作为此按钮父类的部件,在这个例子中,父类是正在构造的新部件。在第12行和第15行为标签和另外一个按钮建立了同样的父子关系。
新创建的部件的显示区域为120个像素宽、180个像素高。设置部件在窗口中的位置需要调用setGeometry()。在第11行调用了setGeometry(),将上部的按钮定位在离上端和左边各15像素的位置。同样调用此函数设置按钮的宽为80像素、高为40像素。类似地,在第13行和第16行调用了setGeometry()设置其它部件的位置。setGeometry()前两个参数定义左边和上边;后两个参数定义宽度和高度。
这个程序的main()函数采用和对待其它部件一样的方法来处理这个新建的复合部件。
1 /* compound.cpp */
2 #include <qapplication.h>
3 #include "threewidget.h"
4
5 int main(int argc, char **argv)
6 {
7 QApplication app(argc, argv);
8 ThreeWidget threeWidget;
9 threeWidget.setGeometry(10, 10, 100, 100);
10 app.setMainWidget(&threeWidget);
11 threeWidget.show();
12 return(app.exec());
13 }
在第8行中创建了这个threeWidget对象。部件不能强制固定为对其无效的大小尺寸,因此在第9行调用的setGeometry()是没有用的,因为在部件中已经定义了最大值和最小值。在第11行调用了show(),显示这个部件和它里面所包含的所有部件。