创建对话框
接下来我们用两种方法来创建一个对话框,一种是纯手工编码,一种是用Qt Designer(一种可视化的工具)来创建。
第一个例子是建立一个查找对话框。
创建两个文件finddialog.h 和finddialog.cpp
一下是finddialog.h
1 #ifndef FINDDIALOG_H
2 #define FINDDIALOG_H
3 #include <QDialog>
4 class QCheckBox;
5 class QLabel;
6 class QLineEdit;
7 class QPushButton;
第1,2行避免头文件被多次包含
第3行包含QDialog类的定义,是Qt中所有对话框的基类, QDialog继承与QWidget.
第4至7行是这个类定义中的前向申明。 前向申明(forward declaration)告诉C++编译器这个类存在,而不包含这个类的详细的定义,通常这个定义在这个类的额头文件中,这样加快编译速度。
接下来我们定义FindDialog类
8 class FindDialog : public QDialog
9 {
10 Q_OBJECT
11 public:
12 FindDialog(QWidget *parent = 0);
Q_OBJECT是一个宏,对于所有需要定义信号和槽的类,这个宏必须放在此类定义的开头。
FindDialog构造函数是一个典型的Qt widget类。 Parent参数用于指定父widget.默认值是null,意味着这个对话框没有父窗口。
13 signals:
14 void findNext(const QString &str, Qt::CaseSensitivity cs);
15 void findPrevious(const QString &str, Qt::CaseSensitivity cs);
signals部分定义2个信号,当用户点击Find按钮,这两个信号会被发射。如果向后搜索被选中,对话框发射findPrevious()信号,反过来发射findNext()信号。
Signals关键字其实就是一个宏。C++预处理器会把这个宏转换为标准的C++代码。Qt::CaseSensitivity是一个枚举类型,可以是Qt::CaseSensitive和Qt::CaseInsensitive.
16 private slots:
17 void findClicked();
18 void enableFindButton(const QString &text);
19 private:
20 QLabel *label;
21 QLineEdit *lineEdit;
22 QCheckBox *caseCheckBox;
23 QCheckBox *backwardCheckBox;
24 QPushButton *findButton;
25 QPushButton *closeButton;
26 };
27 #endif
在private部分我们定义了2个槽函数。Slots关键字跟signals一样是一个宏。
接下来看看finddialog.cpp文件,里面包含finddialog类的具体实现。
1 #include <QtGui>
2 #include "finddialog.h"
首先我们包含了<QtGui>, 这是一个头文件里面包含了所有Qt GUI类的定义。
Qt由很多模块组成,每个模块都有自己的库。最重要的几个模块是 QtCore, QtGui, QtNetwork, QtOpenGL, QtScript, QtSql, QtSvg和QtXml。<QtGui>头文件包含了所有QtGui模块和一部分QtCore模块中的类。包含这个类我们就不需要单独的一个一个去包含我们需要用到的类了。
在finddialog.h头文件中,我们也可以简单的包含<QtGui>,但这不是一个好的编程风格,<QtGui>是一个很大的头文件,在一个头文件中包含另一个大的头文件会大大降低编译速度。所以这里我们只包含<QDialog>,再用几个前向申明来代替。
3 FindDialog::FindDialog(QWidget *parent)
4 : QDialog(parent)
5 {
6 label = new QLabel(tr("Find &what:"));
7 lineEdit = new QLineEdit;
8 label->setBuddy(lineEdit);
9 caseCheckBox = new QCheckBox(tr("Match &case"));
10 backwardCheckBox = new QCheckBox(tr("Search &backward"));
11 findButton = new QPushButton(tr("&Find"));
12 findButton->setDefault(true);
13 findButton->setEnabled(false);
14 closeButton = new QPushButton(tr("Close"));
第4行把parent参数传给基类QDialog.然后创建一个QLabel。函数tr()用于把字符串转换为其他语言。tr()在QOject类中定义以及所有包含Q_OBJECT宏的子类。这是一个很好的编程习惯,把所有用户可见的字符串用函数tr()进行转换,即使目前你还没有计划把程序转换为其他语言。在第18章中我们还会讲。
字符串中&代表快捷键。例如第11行中创建一个Find按钮,用户按下Alt+F可以触发一个按钮事件。&符号还可以用来控制焦点:第6行我们创建一个label,快捷键为Alt+W,在第8行我们设置label的密友(buddy)为line editor.当label的快捷键按下后,它的密友widget就得到焦点。所以当用户按下Alt+W时,line editor得到焦点。
第12行我们设置Find按钮为对话框的默认按钮,即当用户按下Enter时,默认按钮被触发。
第13行使Find按钮不起作用,通常显示灰色,不会响应用户操作。
15 connect(lineEdit, SIGNAL(textChanged(const QString &)),