QT 4: программирование GUI на С++ | страница 52



Когда закрывается последнее окно, приложение завершает работу. При необходимости мы можем отменить такой режим работы, устанавливая свойство quitOnLastWindowClosed класса QApplication на значение false, и в результате приложение продолжит выполняться до тех пор, пока мы не вызовем функцию QApplication::quit().

>01 void MainWindow::setCurrentFile(const QString &fileName)

>02 {

>03 curFile = fileName;

>04 setWindowModified(false);

>05 QString shownName = "Untitled";

>06 if (!curFile.isEmpty()) {

>07 shownName = strippedName(curFile);

>08 recentFiles.removeAll(curFile);

>09 recentFiles.prepend(curFile);

>10 updateRecentFileActions();

>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 — список имен файлов, которые открывались в приложении недавно. Мы вызываем функцию