Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

Реализация меню File

В данном разделе мы определим слоты и закрытые функции, необходимые для обеспечения работы меню File и для управления списком недавно используемых файлов.

01 void MainWindow::newFile

02 {

03 if (okToContinue )

04 {

05 spreadsheet->clear;

06 setCurrentFile("");

07 }

08 }

Слот newFile вызывается при выборе пользователем пункта меню File | New или при нажатии кнопки New на панели инструментов. Закрытая функция okToContinue задает пользователю вопрос относительно необходимости сохранения изменений («Do you want to save your changes?» — Сохранить изменения?), если изменения до этого не были сохранены. Она возвращает значение true, если пользователь отвечает Yes или No (сохраняя документ при ответе Yes), и она возвращает значение false, если пользователь отвечает Cancel. Функция Spreadsheet::clear очищает все ячейки и формулы электронной таблицы. Закрытая функция setCurrentFile кроме установки закрытой переменной curFile и обновления списка недавно используемых файлов изменяет заголовок окна, отражая тот факт, что редактируемый документ не имеет заголовка.

01 bool MainWindow::okToContinue

02 {

03 if (isWindowModified) {

04 int r = QMessageBox::warning(this,

05 tr("Spreadsheet"), tr("The document has been modified.\n"

06 "Do you want to save your changes?"),

07 QMessageBox::Yes | QMessageBox::Default,

08 QMessageBox::No,

09 QMessageBox::Cancel | QMessageBox::Escape);

10 if (r == QMessageBox::Yes) {

11 return save;

12 } else if (r == QMessageBox::Cancel) {

13 return false;

14 }

15 }

16 return true;

17 }

B okToContinue мы проверяем свойство windowModified. Если оно имеет значение true, мы выводим на экран сообщение, показанное на рис. 3.9. Окно сообщения содержит кнопки Yes, No и Cancel. Модификатор QMessageBox::Default делает Yes кнопкой, которая выбирается по умолчанию. Модификатор QMessageBox::Escape задает клавишу Esc в качестве синонима кнопки Cancel.

Рис. 3.9. «Сохранить изменения?»

Вызов функции warning на первый взгляд может показаться слишком сложным, но он имеет очень простой формат:

QMessageBox::warning(родительский объект, заголовок, сообщение, кнопка0, кнопка1, …);

QMessageBox содержит функции information, question и critical, каждая из которых имеет собственную пиктограмму.

Рис. 3.10. Пиктограммы окна сообщения.

01 void MainWindow::open

02 {

03 if (okToContinue) {

04 QString fileName =
QFileDialog::getOpenFileName(".", fileFilters, this);

05 if (!fileName.isEmpty)

06 loadFile(fileName);

07 }

08 }

Слот open соответствует пункту меню File | Open. Как и слот newFile, он сначала вызывает okToContinue для обработки несохраненных изменений. Затем он вызывает удобную статическую функцию QFileDialog::getOpenFileName для получения от пользователя нового имени файла. Эта функция выводит на экран диалоговое окно для выбора пользователем файла и возвращает имя файла или пустую строку при нажатии пользователем клавиши Cancel.

В первом аргументе функции QFileDialog::getOpenFileName задается родительский виджет. Взаимодействие родительских и дочерних объектов для диалоговых окон и для других виджетов будет различно. Диалоговое окно всегда является самостоятельным окном, однако если у него имеется родитель, то оно размещается по умолчанию в верхней части родительского объекта. Кроме того, дочернее диалоговое окно использует панель задач родительского объекта.

Во втором аргументе задается название диалогового окна. В третьем аргументе задается каталог начала просмотра файлов; в нашем случае это будет текущий каталог.

Четвертый аргумент определяет фильтры файлов. Фильтр файла состоит из описательной части и образца поиска. Если допустить поддержку не только родного формата файлов приложения Электронная таблица, а также формата файлов с запятой в качестве разделителя и файлов Lotus 1-2-3, нам пришлось бы инициализировать переменные следующим образом:

tr("Spreadsheet files (*.sp)\n"

"Comma-separated values files (*.csv)\n"

"Lotus 1-2-3 files (*.wk1 *.wks)")

Закрытая функция loadFile вызвана в open для загрузки файла. Мы делаем эту функцию независимой, поскольку нам потребуется выполнить те же действия для загрузки файлов, которые открывались недавно:

01 bool MainWindow::loadFile(const QString &fileName)

02 {

03 if (!spreadsheet->readFile(fileName)) {

04 statusBar->showMessage(tr("Loading canceled"), 2000);

05 return false;

  • Читать дальше
  • 1
  • ...
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: