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