QT 4: программирование GUI на С++ | страница 55
При создании немодальных диалоговых окон они обычно имеют свои сигналы, соединенные со слотами, которые реагируют на действия пользователя:
>01 void MainWindow::find()
>02 {
>03 if (!findDialog) {
>04 findDialog = new FindDialog(this);
>05 connect(findDialog, SIGNAL (findNext(const QString &,
>06 Qt::CaseSensitivity)),
>07 spreadsheet, SLOT (findNext(const QString &,
>08 Qt::CaseSensitivity)));
>09 connect(findDialog, SIGNAL(findPrevious(const QString &,
>10 Qt::CaseSensitivity)),
>11 spreadsheet, SLOT(findPrevious(const QString &,
>12 Qt::CaseSensitivity)));
>13 }
>14 findDialog->show();
>15 findDialog->activateWindow();
>16 }
Диалоговое окно Find позволяет пользователю выполнять поиск текста в электронной таблице. Слот find() вызывается при выборе пользователем пункта меню Edit | Find (Правка | Найти) для вывода на экран диалогового окна Find. После этого возможны три сценария развития событий в зависимости от следующих условий:
• диалоговое окно Find вызывается пользователем первый раз;
• диалоговое окно Find уже вызывалось, но пользователь его закрыл;
• диалоговое окно Find уже вызывалось, и оно по-прежнему видимо.
Если нет диалогового окна Find, мы создаем его, а его функции findNext() и findPrevious() подсоединяем к соответствующим слотам электронной таблицы Spreadsheet. Мы могли бы также создать это диалоговое окно в конструкторе MainWindow, но отсрочка его создания ускоряет запуск приложения. Кроме того, если это диалоговое окно никогда не будет использовано, то оно и не будет создаваться, что сэкономит время и память.
Затем мы вызываем функции show() и activateWindow() и тем самым делаем это окно видимым и активным. Чтобы сделать скрытое окно видимым и активным, достаточно вызвать функцию show(), но диалоговое окно Find может вызываться, когда оно уже имеется на экране, и в этом случае функция show() ничего не будет делать и необходимо вызвать activateWindow(), чтобы сделать окно активным. Можно поступить по-другому и написать:
>if (findDialog->isHidden()) {
> findDialog->show();
>} else {
> findDialog->activateWindow();
>}
что аналогично ситуации, когда вы смотрите в обе стороны при переходе улицы с односторонним движением.
Теперь мы перейдем к созданию диалогового окна Go-to-Cell (перейти на ячейку). Мы хотим, чтобы пользователь мог его вызвать, произвести соответствующие действия с его помощью и затем закрыть его, причем пользователь не должен иметь возможность переходить на любое другое окно приложения. Это означает, что диалоговое окно перехода на ячейку должно быть модальным. Окно называется