Саммерфилд Марк
Шрифт:
Реализация меню File
В данном разделе мы определим слоты и закрытые функции, необходимые для обеспечения работы меню File и для управления списком недавно используемых файлов.
Слот newFile вызывается при выборе пользователем пункта меню File | New или при нажатии кнопки New на панели инструментов. Закрытая функция okToContinue задает пользователю вопрос относительно необходимости сохранения изменений («Do you want to save your changes?» — Сохранить изменения?), если изменения до этого не были сохранены. Она возвращает значение true, если пользователь отвечает Yes или No (сохраняя документ при ответе Yes), и она возвращает значение false, если пользователь отвечает Cancel. Функция Spreadsheet::clear очищает все ячейки и формулы электронной таблицы. Закрытая функция setCurrentFile кроме установки закрытой переменной curFile и обновления списка недавно используемых файлов изменяет заголовок окна, отражая тот факт, что редактируемый документ не имеет заголовка.
B okToContinue мы проверяем свойство windowModified. Если оно имеет значение true, мы выводим на экран сообщение, показанное на рис. 3.9. Окно сообщения содержит кнопки Yes, No и Cancel. Модификатор QMessageBox::Default делает Yes кнопкой, которая выбирается по умолчанию. Модификатор QMessageBox::Escape задает клавишу Esc в качестве синонима кнопки Cancel.
Рис. 3.9. «Сохранить изменения?»
Вызов функции warning на первый взгляд может показаться слишком сложным, но он имеет очень простой формат:
QMessageBox содержит функции information, question и critical, каждая из которых имеет собственную пиктограмму.
Рис. 3.10. Пиктограммы окна сообщения.
Слот open соответствует пункту меню File | Open. Как и слот newFile, он сначала вызывает okToContinue для обработки несохраненных изменений. Затем он вызывает удобную статическую функцию QFileDialog::getOpenFileName для получения от пользователя нового имени файла. Эта функция выводит на экран диалоговое окно для выбора пользователем файла и возвращает имя файла или пустую строку при нажатии пользователем клавиши Cancel.
В первом аргументе функции QFileDialog::getOpenFileName задается родительский виджет. Взаимодействие родительских и дочерних объектов для диалоговых окон и для других виджетов будет различно. Диалоговое окно всегда является самостоятельным окном, однако если у него имеется родитель, то оно размещается по умолчанию в верхней части родительского объекта. Кроме того, дочернее диалоговое окно использует панель задач родительского объекта.
Во втором аргументе задается название диалогового окна. В третьем аргументе задается каталог начала просмотра файлов; в нашем случае это будет текущий каталог.
Четвертый аргумент определяет фильтры файлов. Фильтр файла состоит из описательной части и образца поиска. Если допустить поддержку не только родного формата файлов приложения Электронная таблица, а также формата файлов с запятой в качестве разделителя и файлов Lotus 1-2-3, нам пришлось бы инициализировать переменные следующим образом:
Закрытая функция loadFile вызвана в open для загрузки файла. Мы делаем эту функцию независимой, поскольку нам потребуется выполнить те же действия для загрузки файлов, которые открывались недавно: