Конструктор FindDialog является типичным для классов виджетов в Qt. В параметре parent (родитель) указывается родительский виджет. По умолчанию задается нулевой указатель, указывающий на то, что у данного диалога нет родительского виджета.
13 signals:
14 void findNext(const QString &str, Qt::CaseSensitivity cs);
15 void findPrev(const QString &str, Qt::CaseSensitivity cs);
В секции signals объявляется два сигнала, которые генерируются диалоговым окном при нажатии пользователем кнопки Find (найти). Если установлен флажок поиска в обратном направлении (Search backward), генерируется сигнал findPrevious; в противном случае генерируется сигнал findNext .
Ключевое слово signals на самом деле является макросом. Препроцессор С++ преобразует его в стандартные инструкции языка С++ и затем передает их компилятору. 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) секции класса мы объявляем два слота. Для реализации слотов нам потребуется большинство дочерних виджетов диалогового окна, поэтому мы резервируем для них соответствующие переменные—указатели. Ключевое слово slots, так же как и signals, является макросом, который преобразуется в последовательность инструкций, понятных компилятору С++.
Для закрытых переменных мы использовали предварительные объявления их классов. Это допустимо, потому что все они являются указателями, и мы не используем их в заголовочном файле — поэтому компилятору не требуется иметь полные определения классов. Мы могли бы воспользоваться соответствующими заголовочными файлами (, и так далее), но при использовании предварительных объявлений компилятор работает немного быстрее.
Теперь рассмотрим файл finddialog.cpp, в котором находится реализация класса FindDialog.
01 #include
02 #include "finddialog.h"
Во-первых, мы включаем — заголовочный файл, который содержит определения классов графического интерфейса Qt. Qt состоит из нескольких модулей, каждый из которых находится в своей собственной библиотеке. Наиболее важными модулями являются QtCore, QtGui, QtNetwork, QtOpenGL, QtSql, QtSvg и QtXml. Заголовочный файл содержит определение всех классов, входящих в модули QtCore и QtGui. Включив этот заголовочный файл, мы можем не беспокоиться о включении каждого отдельного класса.
В filedialog.h вместо включения и использования предварительных объявлений для классов QCheckBox, QLabel, QLineEdit и QPushButton мы могли бы просто включить . Однако включение такого большого заголовочного файла, взятого из другого заголовочного файла, обычно свидетельствует о плохом стиле кодирования, особенно при разработке больших приложений.
03 FindDialog::FindDialog(QWidget *parent)
04 : QDialog(parent)
05 {
06 label = new QLabel(tr("Find &what:"));
07 lineEdit = new QLineEdit;
08 label->setBuddy(lineEdit);
09 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"));