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



задает пользователю вопрос относительно необходимости сохранения изменений («Do you want to save your changes?» — Сохранить изменения?), если изменения до этого не были сохранены. Она возвращает значение true, если пользователь отвечает Yes или No (сохраняя документ при ответе Yes), и она возвращает значение false, если пользователь отвечает Cancel. Функция Spreadsheet::clear() очищает все ячейки и формулы электронной таблицы. Закрытая функция setCurrentFile() кроме установки закрытой переменной curFile и обновления списка недавно используемых файлов изменяет заголовок окна, отражая тот факт, что редактируемый документ не имеет заголовка.

>01 bool MainWindow::okToContinue()

>02 {

>03 if (isWindowModified()) {

>04 int r = QMessageBox::warning(this,

>05 tr("Spreadsheet"), tr("The document has been modified.\n"

>06 "Do you want to save your changes?"),

>07 QMessageBox::Yes | QMessageBox::Default,

>08 QMessageBox::No,

>09 QMessageBox::Cancel | QMessageBox::Escape);

>10 if (r == QMessageBox::Yes) {

>11 return save();

>12 } else if (r == QMessageBox::Cancel) {

>13 return false;

>14 }

>15 }

>16 return true;

>17 }

B okToContinue() мы проверяем свойство windowModified. Если оно имеет значение true, мы выводим на экран сообщение, показанное на рис. 3.9. Окно сообщения содержит кнопки Yes, No и Cancel. Модификатор QMessageBox::Default делает Yes кнопкой, которая выбирается по умолчанию. Модификатор QMessageBox::Escape задает клавишу Esc в качестве синонима кнопки Cancel.

Рис. 3.9. «Сохранить изменения?»

Вызов функции warning() на первый взгляд может показаться слишком сложным, но он имеет очень простой формат:

>QMessageBox::warning(родительский объект, заголовок, сообщение, кнопка0, кнопка1, …);

QMessageBox содержит функции information(), question() и critical(), каждая из которых имеет собственную пиктограмму.

Рис. 3.10. Пиктограммы окна сообщения.

>01 void MainWindow::open()

>02 {

>03 if (okToContinue()) {

>04 QString fileName => QFileDialog::getOpenFileName(".", fileFilters, this);

>05 if (!fileName.isEmpty())

>06 loadFile(fileName);

>07 }

>08 }

Слот open() соответствует пункту меню File | Open. Как и слот newFile(), он сначала вызывает okToContinue() для обработки несохраненных изменений. Затем он вызывает удобную статическую функцию