Шаг 149.
Библиотека Qt.
Пример создания диалогового окна поиска

    На этом шаге рассмотрим пример создания диалогового окна поиска последовательности символов, заданной пользователем.

    Следующим примером будет диалоговое окно Find (Найти), показанное на рис. 1, для поиска заданной пользователем последовательности символов.


Рис.1. Диалоговое окно поиска

    Реализуем это диалоговое окно в виде его собственного класса, сделаем его независимым и самодостаточным компонентом, со своими сигналами и слотами. Исходный код программы содержится в двух файлах: finddialog.h и finddialog.срр. Сначала приведем файл finddialog.h:

//Строки 1 и 2 (а также последняя строка) предотвращают многократное
//включение в программу этого заголовочного файла
#ifndef FINDDIALOG_H
#define FINDDIALOG_H
//В строке 3 в программу включается определение QDialog -
//базового класса для диалоговых окон в Qt.
//Класс QDialog происходит от класса QWidget
#include <QDialog>
                   //В строках с 4-й по 7-ю даются предварительные объявления
class QCheckBox;   //классов Qt,использующихся для реализации диалогового окна.
class QLabel;      //Предварительное объявление указывает компилятору C++ 
class QLineEdit;   //только на существование класса, не давая
class QPushButton; //подробного определения этого класса (обычно определение
                   //класса содержится в его собственном заголовочном файле)
//Определяем класс FindDialog как подкласс QDialog
class FindDialog : public QDialog
{
    //Макрос Q_OBJECT необходимо задавать в начале определения
    //любого класса, содержащего сигналы или слоты
    Q_OBJECT
public:
    //Конструктор FindDialog является типичным для классов виджетов в Qt.
    //В параметре parent (родитель) указывается родительский виджет.
    //По умолчанию задается нулевой указатель, указывая на то,
    //что у данного диалога нет родительского виджета
    FindDialog(QWidget *parent = 0);
//В секции signals объявляется два сигнала, которые генерируются 
//диалоговым окном при нажатии пользователем кнопки Найти далее. 
//Ключевое слово signals на самом деле является макросом.
//Препроцессор C++ преобразует его в стандартные инструкции
//языка C++ и затем передает их компилятору
signals:
    //Если установлен флажок поиска в обратном направлении (Искать вверх),
    //генерируется сигнал findPrevious()
    void findPrevious(const QString &str, Qt::CaseSensitivity cs);
    //в противном случае генерируется сигнал findNext().
    //Qt::CaseSensitivity является перечислением и может принимать
    //значение Qt::CaseSensitive или Qt::Caselnsensitive
    void findNext(const QString &str, Qt::CaseSensitivity cs);
//В закрытой (private) секции класса объявляем два слота.
//Для реализации слотов нам потребуется большинство дочерних 
//виджетов диалогового окна, поэтому мы резервируем для них соответствующие
//переменные-указатели. Ключевое слово slots является макросом,
//который преобразуется в последовательность инструкций,
//понятных компилятору C++
private slots:
    void findClicked();
    void enableFindButton(const QString &text);
private:
    QLabel *label;              //Для закрытых переменных мы использовали 
    QLineEdit *lineEdit;        //предварительные объявления их классов.
    QCheckBox *caseCheckBox;    //Это допустимо, потому что они являются указателями,
    QCheckBox *backwardCheckBox;//и мы не используем их в заголовочном файле - 
    QPushButton *findButton;    //поэтому компилятору не требуется иметь
    QPushButton *closeButton;   //полные определения классов 
};
#endif

    На следующем шаге продолжим рассматривать создание диалогового окна поиска.




Предыдущий шаг Содержание Следующий шаг