QT 4: программирование GUI на С++ | страница 49
>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() для обработки несохраненных изменений. Затем он вызывает удобную статическую функцию