Чтение онлайн

ЖАНРЫ

QT 4: программирование GUI на С++

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

Шрифт:

{

backAction->setIcon(forwardIcon);

forwardAction->setIcon(backIcon);

} else {

backAction->setIcon(backIcon);

forwardAction->setIcon(forwardIcon);

}

Обычно приходится переводить пиктограммы, содержащие буквы алфавита. Например, буква «I» на кнопке панели инструментов, отображающая опцию Italic (курсив) текстового процессора, должна быть заменена буквой «С» для испанского языка (Cursivo) и буквой «К» для языков датского, голландского, немецкого, норвежского и шведского (Kursiv). Ниже

показано, как это можно просто сделать:

if (tr("Italic")[0] == 'C') {

italicAction->setIcon(iconC);

} else if (tr("Italic")[0] == 'K') {

italicAction->setIcon(iconK);

} else {

italicAction->setIcon(iconI);

}

Можно поступить по-другому и использовать средства ресурсной системы, обеспечивающие поддержку нескольких локализаций. В файле .qrc мы можем определять локализацию для ресурса, используя атрибут lang. Например:

<qresource>

<file>italic.png</file>

</qresource>

<qresource lang="es">

<file alias="italic.png">cursivo.png</file>

</qresource>

<qresource lang="sv">

<file alias="italic.png'">kursiv.png</file>

</qresource>

Если пользовательской локализацией является es (Espanol), :/italic.png становится ссылкой на изображение cursivo.png. Если пользовательской локализацией является sv (Svenska), используется изображение kursiv.png. Для других локализаций используется italic.png.

Динамическое переключение языков

Для большинства приложений вполне удовлетворительный результат обеспечивают определение предпочитаемого пользователем языка в функции main и загрузка там соответствующих файлов .qm. Но в некоторых ситуациях пользователям необходимо иметь возможность динамического переключения языка. Если приложение постоянно используется попеременно различными пользователями, может возникнуть необходимость в изменении языка без перезапуска приложения. Например, это часто требуется для приложений, применяемых операторами центров заказов, синхронными переводчиками и операторами компьютеризованных кассовых аппаратов.

Обеспечение в приложении возможности динамического переключения языков требует немного большего, чем просто загрузка одного файла перевода при запуске приложения, но это нетрудно сделать.

Порядок действий должен быть следующим:

• предусмотрите средство, с помощью которого пользователь сможет переключаться с одного языка на другой;

• для каждого виджета или диалогового окна укажите все требующие перевода строки в отдельной функции (эта функция часто называется retranslateUi), и вызывайте эту функцию всякий раз при изменении языка.

Давайте рассмотрим соответствующую часть исходного кода приложения «call center» (центр заказов). Приложение содержит меню Language (язык), чтобы пользователь имел возможность задавать язык во время работы приложения. По умолчанию применяется английский язык.

Рис. 17.1.

Динамическое меню Language.

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

Давайте рассмотрим подкласс QMainWindow этого приложения:

01 MainWindow::MainWindow

02 {

03 journalView = new JournalView;

04 setCentralWidget(journalView);

05 qApp->installTranslator(&appTranslator);

06 qApp->installTranslator(&qtTranslator);

07 qmPath = qApp->applicationDirPath + "/translations";

08 createActions;

09 createMenus;

10 retranslateUi;

11 }

В конструкторе мы устанавливает центральный виджет JournalView как подкласс QTableWidget. Затем мы настраиваем несколько закрытых переменных—членов, имеющих отношение к переводу:

• переменная appTranslator является объектом QTranslator, который используется для хранения текущего перевода приложения;

• переменная qtTranslator является объектом QTranslator, который используется для хранения перевода библиотеки Qt;

• переменная qmPath имеет тип QString и задает путь к каталогу, который содержит файлы перевода приложения.

В конце мы вызываем закрытые функции createActions и createMenus для создания системы меню и также закрытую функцию retranslateUi для первой установки значений видимых пользователем строк.

01 void MainWindow::createActions

02 {

03 newAction = new QAction(this);

04 connect(newAction, SIGNAL(triggered), this, SLOT(newFile));

05 …

06 aboutQtAction = new QAction(this);

07 connect(aboutQtAction, SIGNAL(triggered), qApp, SLOT(aboutQt));

08 }

Функция createActions создает объекты QAction как обычно, но без установки текстов пунктов меню и клавиш быстрого вызова команд. Это будет сделано в функции retranslateUi.

01 void MainWindow::createMenus

02 {

03 fileMenu = new QMenu(this);

04 fileMenu->addAction(newAction);

05 fileMenu->addAction(openAction);

06 fileMenu->addAction(saveAction);

07 fileMenu->addAction(exitAction);

08 …

09 createLanguageMenu;

10 helpMenu = new QMenu(this);

11 helpMenu->addAction(aboutAction);

Поделиться с друзьями: