QT 4: программирование GUI на С++
Шрифт:
B okToContinue мы проверяем свойство windowModified. Если оно имеет значение true, мы выводим на экран сообщение, показанное на рис. 3.9. Окно сообщения содержит кнопки Yes, No и Cancel. Модификатор QMessageBox::Default
Рис. 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 для загрузки файла. Мы делаем эту функцию независимой,
Мы используем функцию Spreadsheet::readFile для чтения файла с диска. Если загрузка завершилась успешно, мы вызываем функцию setCurrentFile для обновления заголовка окна; в противном случае функция Spreadsheet::readFile уведомит пользователя о возникшей проблеме, выдав соответствующее сообщение. В целом полезно предусматривать выдачу сообщений об ошибках в компонентах низкого уровня, поскольку они могут обеспечить получение точной информации о причинах ошибки.
В обоих случаях мы будем выдавать сообщение в строке состояния в течение 2 секунд (2000 миллисекунд) для того, чтобы пользователь знал о выполняемых приложением действиях.
Слот save соответствует пункту меню File | Save. Если файл уже имеет имя, потому что уже открывался до этого или уже сохранялся, слот save вызывает saveFile, задавая это имя; в противном случае он просто вызывает saveAs.
Слот saveAs соответствует пункту меню File | Save As. Мы вызываем QFileDialog::getSaveFileName для получения имени файла от пользователя. Если пользователь нажимает кнопку Cancel, мы возвращаем значение false, которое передается дальше вплоть до вызвавшей функции (save или okToContinue).