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

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

Шрифт:

11 }

12 setWindowTitle(tr("%1[*] - %2").arg(shownName)

13 .arg(tr("Spreadsheet")));

14 }

15 QString MainWindow::strippedName(const QString &fullFileName)

16 {

17 return QFileInfo(fullFileName).fileName;

18 }

В функции 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». Проще написать:

setWindowTitle(shownName + tr("[*] - Spreadsheet"));

но применение arg облегчает перевод сообщения на другие языки.

Если задано имя файла, мы обновляем recentFiles — список имен файлов, которые открывались в приложении недавно. Мы вызываем функцию removeAll для удаления всех файлов с этим именем из списка, чтобы избежать дублирования; затем мы вызываем функцию prepend для помещения имени данного файла в начало списка. После обновления списка имен файлов мы вызываем функцию updateRecentFileActions для обновления пунктов меню File.

01 void MainWindow::updateRecentFileActions

02 {

03 QMutableStringListIterator i(recentFiles);

04 while (i.hasNext) {

05 if (!QFile::exists(i.next))

06 i.remove;

07 }

08 for (int j = 0; j < MaxRecentFiles; ++j) {

09 if (j < recentFiles.count) {

10 QString text = tr("&%1 %2")

11 .arg(j + 1)

12 .arg(strippedName(recent Files[j]));

13 recentFileActions[j]->setText(text);

14 recentFileActions[j]->setData(recentFiles[j]);

15 recentFileActions[j]->setVisible(true);

16 } else {

17 recentFileActions[j]->setVisible(false);

18 }

19 }

20 separatorAction->setVisible(!recentFiles.isEmpty);

21 }

Сначала мы удаляем все файлы, которые больше не существуют, используя итератор в стиле Java. Некоторые файлы могли использоваться в предыдущем сеансе, но с этого момента их уже не будет. Переменная recentFiles имеет тип QStringList (список QStrings). В главе 11 подробно рассматриваются такие классы—контейнеры, как QStringList, и их связь со стандартной библиотекой шаблонов С++ (Standard Template Library — STL), a также применение в Qt классов итераторов в стиле Java.

Затем мы снова проходим по списку файла, на этот раз пользуясь индексацией массива. Для каждого файла мы создаем строку из амперсанда, номера файла (j + 1), пробела и имени файла (без пути). Для соответствующего пункта меню мы задаем этот текст. Например, если первым был файл С:\My Documents\tab04.sp, пункт меню первого недавно используемого файла будет иметь текст «&1 tab04.sp».

Рис. 3.11. Меню File со списком файлов, которые открывались недавно.

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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