QT 4: программирование GUI на С++ | страница 22



>38 }

Наконец, мы задаем название диалогового окна и устанавливаем фиксированной его высоту, поскольку в диалоговом окне нет виджетов, которым может понадобиться дополнительное пространство по вертикали. Функция QWidget::sizeHint() возвращает «идеальный» размер виджета.

На этом завершается рассмотрение конструктора FindDialog. Поскольку нами использован оператор new при создании виджетов и менеджеров компоновки, нам, по-видимому, придется написать деструктор, где будут предусмотрены операторы delete для удаления каждого созданного нами виджета и менеджера компоновки. Но поступать так не обязательно, поскольку Qt автоматически удаляет дочерние объекты при разрушении родительского объекта, а все дочерние виджеты и менеджеры компоновки являются потомками FindDialog.

Теперь мы рассмотрим слоты диалогового окна:

>39 void FindDialog::findClicked()

>40 {

>41 QString text = lineEdit->text();

>42 Qt::CaseSensitivity cs =

>43 caseCheckBox->isChecked() ? Qt::CaseSensitive

>44 : Qt::CaseInsensitive;

>45 if (backwardCheckBox->isChecked()) {

>46 emit findPrevious(text, cs);

>47 } else {

>48 emit findNext(text, cs);

>49 }

>50 }


>51 void FindDialog::enableFindButton(const QString &text)

>52 {

>53 findButton->setEnabled(!text.isEmpty());

>54 }

Слот findClicked() вызывается при нажатии пользователем кнопки Find. Он генерирует сигнал findPrevious() или findNext() в зависимости от состояния флажка Search backward (поиск в обратном направлении). Ключевое слово emit (генерировать сигнал) имеет особый смысл в Qt; как и другие расширения Qt, оно преобразуется препроцессором С++ в стандартные инструкции С++.

Слот enableFindButton() вызывается при любом изменении значения в строке редактирования. Он устанавливает активный режим кнопки, если в редактируемой строке имеется какой-нибудь текст; в противном случае кнопка устанавливается в неактивный режим.

Эти два слота завершают написание программы диалогового окна. Теперь мы можем создать файл main.cpp и протестировать наш виджет FindDialog:

>01 #include

>02 #include "finddialog.h"

>03 int main(int argc, char *argv[])

>04 {

>05 QApplication app(argc, argv);

>06 FindDialog *dialog = new FindDialog;

>07 dialog->show();

>08 return app.exec();

>09 }

Для компиляции этой программы выполните обычную команду qmake. Поскольку определение класса FindDialog содержит макрос