QDialog widget是一个可以用来创建对话框的基类,同时它还可以直接用来处理简单的部件的布局。QDialog是一个简单的部件,除了显示空白窗口之外,它不再显示其它东西,但它可以作为部件的容器,而且它也具有在唯一的窗口中显示自己的能力。此外,可能需要向窗口中加入按钮,那么它还有其它一些嵌入的功能以响应按钮。
下面的例子演示了创建和显示对话框的基本工作,说明了QDialog对象是如何能够作为对话框显示出来的。
Main
1 /* simple.cpp */
2 #include <kapp.h>
3 #include “toplevel.h”
4
5 int main(int argc,char **argv)
6 {
7 KApplication app(argc,argv,”simple”);
8 TopLevel toplevel;
9 toplevel.show();
10 app.setMainWidget(&toplevel);
11 return(app.exec());
12 }
主窗口代码创建了一个KApplication对象,然后创建并且安装了一个TopLevel部件作为它的顶层窗口。
TopLavel Header
2 #ifndef TOPLEVEL_H
3 #define TOPLEVEL_H
4
5 #include <qwidget.h>
6
7 class TopLevel: public QWidget
8 {
9 Q_OBJECT
10 public:
11 TopLevel(QWidget *parent=0,const char *name=0);
12 private slots:
13 void popupDialog();
14 };
15
16 #endif
由于TopLevel窗口是由QWidget继承而来的,所以它是一个部件,并且被用来作为程序的顶层窗口。类定义只包含了一个构造函数和为了响应按钮所需要的最少的信息。为了在第12行和第13行设置slot,必须要有第9行的宏Q_OBJECT。无论何时点击按钮,继承slot方法的popupDialog()就会被调用。
TopLevel
1 /* toplevel.cpp */
2 #include “toplevel.h”
3 #include <qdialog.h>
4 #include <qpushbutton.h>
5
6 TopLevel::TopLevel(QWidget *parent,const char *name)
7 : QWidget(parent,name)
8 {
9 setMinimumSize(200,80);
10 setMaximumSize(200,80);
11
12 QPushButton *button = new QPushButton(“Pop Up”,this);
13 button->setGeometry(50,20,100,40);
14 connect(button,SIGNAL(clicked()),
15 this,SLOT(popupDialog()));
16 }
17 void TopLevel::popupDialog()
18 {
19 QDialog *dialog = new QDialog(0,”popup”,FALSE);
20 dialog->setCaption(“A QDialog Window”);
21 dialog->setMinimumSize(200,80);
22 dialog->setMaximumSize(200,80);
23
24 QPushButton *button =
25 new QPushButton(“Pop Down”,dialog);
26 button->setGeometry(50,20,100,40);
27 connect(button,SIGNAL(clicked()),
28 dialog,SLOT(accept()));
29
30 dialog->show();
31 }
这段代码包含了TopLevel部件的定义,包括创建和显示对话框的方法。
TopLevel部件是程序的主窗口。在它的构造函数中,第9行和第10行设置了窗口的尺寸,因此它不能够改变大小——最大值和最小值限制是相等的。在第12行,创建了一个按钮。在第13行指定了按钮的高度和宽度设置,并将它定位在左上角。第14行的调用connect()请求将按钮中clicked()方法产生的信号传送给TopLevel部件中的popupDialog() slot。
每次用户点击TopLevel窗口中的按钮,就会调用第17行的popupDialog()方法。第19行到第22行创建了QDialog部件的实例,并且指定了它的大小和标题。第24行到第26行在对话框内部创建了一个按钮,并设置了大小。第27行的调用connect()请求将此按钮的clicked()方法产生的信号传送给QDialog部件内部的accept()方法。因为QDialog部件是能够在它自己的窗口中显示的,所以第30行调用了show(),使它显示出来。
QDialog部件是相当灵活的,几乎可以只使用它来创建所有的对话框。可以用slot和accept()方法关闭对话框,就像这个例子一样,此外,也可以调用reject()来关闭对话框。这两种处理方法唯一不同的是一个将要返回结果设置为TRUE,另一个设置为FALSE。这些设置对应的对话框中通常显示的Cancel和OK按钮。
当调用accept()或者reject()关闭对话框时,对话框并没有被解构。对话框窗口由于调用hide()方法而被关闭。这样的好处是程序还可以访问对话框中的设置,但是你不得不自己删除掉对话框。然而,在需要一回回不停使用同一个对话框的情况下,只需创建一次就可以了,然后按照自己的需要调用hide()或者show()。
这个简单的程序存在两个问题。首先,可以随心所欲的弹出很多的对话框。每次点击Pop Up按钮的时候,就会产生一个新的对话框,让它自己去运行着。其次当用Pop Down按钮关闭对话框的时候,它并没有被删除,它随着accept()的调用而关闭,但是它还存在着,程序没有了指向它的指针。