Если файл с данным именем уже существует, функция getSaveFileName попросит пользователя подтвердить его перезапись. Такое поведение можно предотвратить, передавая функции getSaveFileName дополнительный аргумент QFileDialog::DontConfirmOverwrite.
пользователь выбирает пункт меню File | Exit или щелкает по кнопке X заголовка окна, вызывается слот QWidget::close. В результате будет сгенерировано событие виджета «close» (закрытие). Переопределяя функцию QWidget::closeEvent, мы можем перехватывать команды по закрытию главного окна и принимать решения относительно возможности его фактического закрытия.
Если изменения не сохранены и пользователь нажимает кнопку Cancel, мы «игнорируем» это событие, и оно никак не повлияет на окно. В обычном случае мы реагируем на это событие, и в результате Qt закроет окно. Мы вызываем также закрытую функцию writeSettings для сохранения текущих настроек приложения.
Когда закрывается последнее окно, приложение завершает работу. При необходимости мы можем отменить такой режим работы, устанавливая свойство quitOnLastWindowClosed класса QApplication на значение false, и в результате приложение продолжит выполняться до тех пор, пока мы не вызовем функцию QApplication::quit.
В функции setCurrentFile мы задаем значение закрытой переменной curFile, в которой содержится имя редактируемого файла. Перед тем как отобразить имя файла в заголовке, мы убираем путь к файлу с помощью функции strippedName, чтобы имя файла выглядело более привлекательно.
Каждый QWidget имеет свойство windowModified,
которое должно быть установлено на значение true, если документ окна содержит несохраненные изменения, и на значение false в противном случае. В системе Mac OS X несохраненные документы отмечаются точкой на кнопке закрытия, расположенной в заголовке окна, в других системах такие документы отмечаются звездочкой в конце имени файла. Все это обеспечивается в Qt автоматически, если мы своевременно обновляем свойство windowModified и помещаем маркер «[*]» в заголовок окна по мере необходимости.
В функцию setWindowTitle мы передали следующий текст:
tr("%1[*] - %2").arg(shownName)
.arg(tr("Spreadsheet"))
Функция QString::arg заменяет своим аргументом параметр «%n» с наименьшим номером и возвращает полученную строку. В нашем случае arg имеет два параметра «%n». При первом вызове функция arg заменяет параметр «%1»; второй вызов заменяет «%2». Если файл имеет имя «budget.sp» и файл перевода не загружен, мы получим строку «budget.sp[*] — Spreadsheet». Проще написать:
но применение arg облегчает перевод сообщения на другие языки.
Если задано имя файла, мы обновляем recentFiles — список имен файлов, которые открывались в приложении недавно. Мы вызываем функцию removeAll для удаления всех файлов с этим именем из списка, чтобы избежать дублирования; затем мы вызываем функцию prepend для помещения имени данного файла в начало списка. После обновления списка имен файлов мы вызываем функцию updateRecentFileActions для обновления пунктов меню File.