в классе MainWindow приложения Электронная таблица четыре закрытые функции имеются также в классе Editor: okToContinue, saveFile, setCurrentFile и strippedName.
Сначала мы создаем действие QAction, представляющее редактор в меню приложения Window, и связываем его со слотами show и setFocus.
Поскольку мы разрешаем пользователям создавать любое количество окон редактора, мы должны предусмотреть соответствующую систему их наименования, чтобы они отличались до первого их сохранения. Один из распространенных методов решения этой проблемы заключается в назначении имен с числами (например, document1.txt). Мы используем переменную isUntitled, чтобы отличить предоставляемые пользователем имена документов и сгенерированные программно.
Мы связываем сигнал текстового документа contentsChanged c закрытым слотом documentWasModified. Этот слот просто вызывает setWindowModified(true).
Наконец, мы устанавливаем атрибут Qt::WA_DeleteOnClose для предотвращения утечек
памяти при закрытии пользователем окна Editor.
После выпрлнения конструктора мы ожидаем вызова либо функции newFile, либо функции open.
Функция newFile генерирует для нового документа имя типа document1.txt. Этот программный код помещен в функцию newFile, a не в конструктор, поскольку мы не хотим использовать числа при вызове функции open для открытия существующего документа во вновь созданном редакторе Editor. Поскольку переменная documentNumber объявлена как статическая, она совместно используется всеми экземплярами Editor.
Маркер «[*]» в заголовке окна указывает место, где мы хотим выдавать звездочку при несохраненных изменениях файла для платформ, отличных от Mac OS X. Мы рассматривали этот маркер в главе 3 .
Функция open пытается открыть сущеcтвующий файл при помощи функции openFile.
01 bool Editor::save
02 {
03 if (isUntitled) {
04 return saveAs;
05 } else {
06 return saveFile(curFile);
07 }
Функция save используёт переменную isUntitled для определения вида вызываемой функции saveFile или saveAs.
01 void Editor::closeEvent(QCloseEvent *event)
02 {
03 if (okToContinue) {
04 event->accept;
05 } else {
06 event->ignore;
07 }
08 }
Функция closeEvent переопределяется, чтобы разрешить пользователю сохранить несохраненные изменения. Вся логика содержится в функции okToContinue, которая выводит сообщение «Do you want to save your changes?» (Сохранить изменения?). Если функция okToContinue возвращает true, мы обрабатывам событие закрытия; в противном случае мы «игнорируем» его и окно оставляем прежним.