На этом шаге рассмотрим использование диалогового окна перехода к ячейке (шаг 153).
Теперь мы перейдем к созданию диалогового окна Перейти на ячейку, показанного на рисунке 1, шаг 153. Мы хотим, чтобы пользователь мог его вызвать, произвести соответствующие действия с его помощью и затем закрыть его; причем пользователь не должен иметь возможность переходить на любое другое окно приложения. Это означает, что диалоговое окно перехода на ячейку должно быть модальным. Окно называется модальным, если после его вызова работа приложения блокируется и оказывается невозможной работа с другими окнами приложения до закрытия этого окна. Все используемые нами до сих пор файловые диалоговые окна и окна с сообщениями были модальными.
Диалоговое окно будет немодальным, если оно вызывается с помощью функции show() (если мы не сделали до этого его модальным, воспользовавшись функцией setModal()); оно будет модальным, если вызывается при помощи функции ехес().
void MainWindow::goToCell() { //Функция goToCell() создает виджет (GoToCellDialog) в виде переменной стека GoToCellDialog dialog(this); /*Функция QDialog::exec() возвращает значение true (QDialog::Accepted), если через диалоговое окно подтверждается действие, и значение false (QDialog::Rejected) в противном случае. Напомним, что мы создали диалоговое окно перехода на ячейку при помощи Qt Designer и подсоединили кнопку ОК к слоту accept(), а кнопку Cancel к слоту reject(). Если пользователь нажимает кнопку ОК, мы устанавливаем текущую ячейку таблицы на значение, заданное в строке редактирования*/ if (dialog.exec()) { QString str = dialog.lineEdit->text().toUpper(); /*В функции QTableWidget::setCurrentCell() задаются два аргумента: индекс строки и индекс столбца. В приложении Электронная таблица обозначение А1 относится к ячейке (0, 0), а обозначение В27 относится к ячейке (26, 1). Для получения индекса строки из возвращаемого функцией QLineEdit::text() значения типа QString мы выделяем номер строки с помощью функции QString::mid() (которая возвращает подстроку с первой позиции до конца этой строки), преобразуем ее в целое число типа int при помощи функции QString::toInt() и вычитаем единицу. Для получения номера столбца мы вычитаем числовой код буквы "А" из числового кода первой буквы строки, преобразованной в прописную. Мы знаем, что строка будет иметь правильный формат, потому что осуществляемый нами контроль диалога с помощью QRegExpValidator делает кнопку ОК активной только в том случае, если за буквой располагается не более трех цифр*/ spreadsheet->setCurrentCell(str.mid(1).toInt() - 1, str[0].unicode() - 'A'); } }
Создание модальных диалоговых окон (и контекстных меню) является обычной практикой программирования, поскольку такое окно (или меню) будет не нужно после его использования, и оно будет автоматически уничтожено при выходе из области видимости.
На следующем шаге продолжим рассматривать применение ранее спроектированных диалоговых окон.