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

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

Шрифт:

Определенную трудность составляет представление удобных названий языкам файлами .qm. Просто использование сокращений «en» для английского языка или «de» для немецкого языка, основанное на названии файла .qm, выглядит не лучшим образом и может запутать некоторых пользователей. Решение, которое используется функцией createLanguageMenu, состоит в «переводе» строки «English» (английский язык) в контексте «MainWindow». Эта строка должна принимать значение «Deutsch» при переводе на немецкий язык, «Francais» при переводе на французский язык и «♦♦♦» при переводе на японский язык.

Мы создаем по одному помечаемому пункту меню QAction на каждый язык и храним локальное имя в его элементе данных. Мы добавляем их в объект QActionGroup, чтобы всегда мог быть помечен только один пункт меню Language. Когда пользователь выбирает какую-то команду из группы, объект QActionGroup генерирует сигнал triggered(QAction *), который связан с switchLanguage.

01 void MainWindow::switchLanguage(QAction *action)

02 {

03 QString locale = action->data.toString;

04 appTranslator.load("callcenter_" + locale, qmPath);

05 qtTranslator.load("qt_" + locale, qmPath);

06 retranslateUi;

07 }

Слот switchLanguage вызывается, когда пользователь выбирает язык из меню Language. Мы загружаем файлы перевода приложения и библиотеки Qt и затем вызываем функцию retranslateUi для нового перевода всех строк главного окна.

В системе Windows в качестве альтернативы меню Language можно использовать обработку событий LocaleChange — события этого типа генерируются Qt при обнаружении изменения среды локализации. Событие этого типа существует на всех платформах, поддерживаемых Qt, но фактически они генерируются только в системе Windows, когда пользователь изменяет системные настройки локализации (при задании параметров региона и языка на Панели управления). Для обработки событий LocaleChange мы можем переопределить функцию QWidget::changeEvent следующим образом:

01 void MainWindow::changeEvent(QEvent *event)

02 {

03 if (event->type == QEvent::LocaleChange) {

04 appTranslator.load("callcenter_"

05 + QLocale::system.name, qmPath);

06 qtTranslator.load("qt_" + QLocale::system.name, qmPath);

07 retranslateUi;

08 }

09 QMainWindow::changeEvent(event);

10 }

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

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

01 JournalView::JournalView(QWidget *parent)

02 : QTableWidget(parent)

03 {

04 retranslateUi;

05 }

Класс JournalView является подклассом QTableWidget. В конце конструктора мы вызываем закрытую функцию retranslateUi для перевода строк виджета. Это напоминает то, что мы делали для класса MainWindow.

01 void JournalView::changeEvent(QEvent *event)

02 {

03 if (event->type == QEvent::LanguageChange)

04 retranslateUi;

05 QTableWidget::changeEvent(event);

06 }

Мы также переопределяем функцию changeEvent для вызова retranslateUi при генерации событий LanguageChange. Qt генерирует событие LanguageChange при изменении содержимого объекта QTranslator, который в данный момент используется в QApplication. В нашем приложении это происходит, когда мы вызываем load для appTranslator или qtTranslator либо из функции MainWindow::switchToLanguage, либо из функции MainWindow::changeEvent.

  • Читать дальше
  • 1
  • ...
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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