QT 4: программирование GUI на С++ | страница 51
>01 bool MainWindow::save()
>02 {
>03 if (curFile.isEmpty()) {
>04 return saveAs();
>05 } else {
>06 return saveFile(curFile);
>07 }
>08 }
>09 bool MainWindow::saveFile(const QString &fileName)
>10 {
>11 if (!spreadsheet->writeFile(fileName)) {
>12 statusBar()->showMessage(tr("Saving canceled"), 2000);
>13 return false;
>14 }
>15 setCurrentFile(fileName);
>16 statusBar()->showMessage(tr("File saved"), 2000);
>17 return true;
>18 }
Слот save() соответствует пункту меню File | Save. Если файл уже имеет имя, потому что уже открывался до этого или уже сохранялся, слот save() вызывает saveFile(), задавая это имя; в противном случае он просто вызывает saveAs().
>01 bool MainWindow::saveAs()
>02 {
>03 QString fileName = QFileDialog::getSaveFileName(this,
>04 tr("SaveSpreadsheet"),
>05 tr("Spreadsheet files (*.sp)"));
>06 if (fileName.isEmpty())
>07 return false;
>08 return saveFile(fileName);
>09 }
Слот saveAs() соответствует пункту меню File | Save As. Мы вызываем QFileDialog::getSaveFileName() для получения имени файла от пользователя. Если пользователь нажимает кнопку Cancel, мы возвращаем значение false, которое передается дальше вплоть до вызвавшей функции (save() или okToContinue()).
Если файл с данным именем уже существует, функция getSaveFileName() попросит пользователя подтвердить его перезапись. Такое поведение можно предотвратить, передавая функции getSaveFileName() дополнительный аргумент QFileDialog::DontConfirmOverwrite.
>01 void MainWindow::closeEvent(QCloseEvent *event)
>02 {
>03 if (okToContinue()) {
>04 writeSettings();
>05 event->accept();
>06 } else {
>07 event->ignore();
>08 }
>09 }
Когда пользователь выбирает пункт меню File | Exit или щелкает по кнопке X заголовка окна, вызывается слот QWidget::close(). В результате будет сгенерировано событие виджета «close» (закрытие). Переопределяя функцию QWidget::closeEvent(), мы можем перехватывать команды по закрытию главного окна и принимать решения относительно возможности его фактического закрытия.
Если изменения не сохранены и пользователь нажимает кнопку Cancel, мы «игнорируем» это событие, и оно никак не повлияет на окно. В обычном случае мы реагируем на это событие, и в результате Qt закроет окно. Мы вызываем также закрытую функцию writeSettings() для сохранения текущих настроек приложения.