ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.11.2023
Просмотров: 57
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Работа с 2D-графикой
71
{
m_pressed = false;
update();
}
void InteractiveItem::hoverEnterEvent(
QGraphicsSceneHoverEvent*)
{
if(!m_hovered) {
prepareGeometryChange();
m_hovered = true;
}
}
void InteractiveItem::hoverLeaveEvent(
QGraphicsSceneHoverEvent*)
{
if(m_hovered) {
prepareGeometryChange();
m_hovered = false;
}
}
Класс QGraphicsItem не наследует от QObject, т. е. не можеть имеет свойств, не определяет слотов, не порождает сигналов и т. д.
Так сделано из соображений экономии памяти и производительности,
Однако, на практике могут возникать ситуации, в которых элементам сцены полезно было бы обладать возможностями QObject. Для этих целей определен класс QGraphicsObject, наследующий от QObject и
QGraphicsItem.
Модифицируем предыдущий пример: заменим базовый класс на
QGraphicsObject и в обработчике нажатия кнопки мыши будем от- правлять сигнал, если в момент нажатия курсор находился в вписан- ном в ограничивающий прямоугольник эллипс.
Пример 7.16
72
Работа с 2D-графикой
// Фрагмент конструктора class InteractiveObject : public QGraphicsObject
{
Q_OBJECT
public:
explicit InteractiveObject(QGraphicsItem *parent = 0);
}
// Фрагмент обработчика нажатия кнопки мыши
QPointF delta = boundingRect().center()-ev->pos();
qreal radius = boundingRect().width()/2.0;
if (delta.x() * delta.x() + delta.y() * delta.y()
<= radius * radius)
emit clicked();
Интернационализация приложений
73
§8.
Интернационализация приложений
Большинство современных программ создается в расчете на ши- рокую аудиторию, включающую пользователей из различных стран.
Поэтому важно предусмотреть механизмы простой адаптации интер- фейса программы к особенностям другого языка. Первостепенной за- дачей интернационализации приложения является перевод всех види- мых пользователю текстов.
Qt обеспечивает поддержку интернационализации, обеспечивая соответствующие программные интерфейсы и предоставляя програм- мисту и переводчику набор специальных утилит: приложение с гра- фическим интерфейсом Qt Linguist и консольные программы lupdate и lrelease.
Общий алгоритм подготовки многоязычной версии приложения можно сформулировать следующим образом:
1. написать код программы, подготовленный к переводу;
2. извлечь строки текста из кода программы;
3. перевести извлеченные строки;
4. скомпилировать перевод в специальный бинарный формат.
На первом этапе необходимо все переводимиые строки провести через вызов функции tr(). Следует заметить, что все строки в объек- тах, сконструированных визуально, с помощью дизайнера форм будут автоматически подготовлены к локализации.
Пример 8.1
// Было trayIcon.showMessage("Message", "Mail!");
// Заменим на trayIcon.showMessage(tr("Message"), tr("Mail!"));
Функция tr() возвращает QString. Подготовить символьный мас- сив для последующей передачи в tr() можно с помощью макроса QT_TR_NOOP.
Пример 8.2
74
Интернационализация приложений char *const EDITOR = QT_TR_NOOP("emacs");
void function() {
QString editor = tr(EDITOR);
}
Для того, чтобы извлечь строки из программы, добавим в файл проекта директиву TRANSLATIONS, перечислив все желаемые фай- лы переводов.
Пример 8.3
TRANSLATIONS = myProject_de.ts \
myProject_fr.ts \
myProject_ru.ts
Запустив программу lupdate в каталоге программы, получим шаб- лоны файлов переводов:
Пример 8.4
user@linux:/myProject> lupdate myProject.pro
Файлы переводов можно открыть в программе Qt Linguist и для каждой извлеченной из исходного кода строки предложить перевод.
После завершения перевода строк, необходимо выполнить команду lrelease (можно из меню Qt Linguist). Будут сгенерированы файлы с расширением «.qm». Это бинарные файлы переводов, они должны быть доступны при загрузке приложения.
Пример 8.5
user@linux:/myProject> lrelease myProject.pro
Интернационализация приложений
75
Для того, чтобы не заботиться об этом, бинарные файлы перево- дов могут быть внедрены в исполняемый файл с помощью ресурсной системы Qt.
В коде программы необходимо обеспечить возможность подгрузки файлов переводов, внедрив код переводчика.
Пример 8.6
// Необходимые файлы заголовков
#include
#include
// Создаем экземпляр переводчика
QApplication app;
QTranslator myTranslator;
myTranslator.load("myProject_" + QLocale::system().name(),
QCoreApplication::applicationDirPath());
app.installTranslator(&myTranslator);
Предложенный код подключает файл переводов, соответствую- щий системной локали, что, как правило, соответствувет предпочте- ниям пользователя. В некоторых случаях, приложение может предо- ставлять пользователю возможность изменения языковых настроек
«на лету». В этом случае построенный в дизайнере форм интерфейс можно переключить на другой язык вызвав метод retranslateUi() в обработчике события LanguageChange.
Пример 8.7
void Widget::changeEvent(QEvent *e)
{
if (e->type() == QEvent::LanguageChange) {
ui->retranslateUi(this);
}
QWidget::changeEvent(e);
}
76
Интернационализация приложений
В некоторых случаях бывает необходимо локализовать ресурсы,
например, если приложение сопровождается несколькими наборами иконок для разных языковых настроек. Ресурсная система Qt позво- ляет указывать локаль для каждого присоединяемого к исполняемой программе файла ресурсов.
Пример 8.8
Инструменты перевода позволяют задействовать контекст, что- бы различать строки, переводимые по-разному в разных обстоятель- ствах. Например, английское слово «Edit» может быть как существи- тельным («Правка»), так и глаголом («Редактировать»). При под- готовке текста к переводу в вызове tr() для определения контекста можно задействовать второй аргумент (см. пример ??.
Пример 8.9
tr("edit", "noun");
tr("edit", "verb");
Контекст будет доступен переводчику в Qt Linguist, помогая вы- брать корректный вариант перевода.
Интернационализация приложений
77
Список литературы
[1] Ж. Бланшет, М. Саммерфилд. Qt 4: программирование GUI на
C++. Пер. с англ. 2-е изд., доп. — М.: КУДИЦ-ПРЕСС, 2008. —
736 с.
[2] М. Шлее М. Qt4.5. Профессиональное программирование на
C++. Пер. с англ. — СПб.: БХВ-Петербург, 2010. - 896 с.
[3] A. Ezust, Alan. An introduction to design patterns in C++ with
QT / Alan Ezust, Paul Ezust. — Pearson Education, 2012. — 764
c.
[4] D. Molkentin. The Book of Qt 4: The Art of Building Qt
Applications. — Open Source Press, 2007. — 430 с.
[5] J. Thelin. Foundations of Qt Development. — APress, 2007. — 534
с.
[6] Qt Developer Network [Электронный ресурс]. 2012. Режим досту- па: http://qt-project.org/doc/
[7] Qt in Education Course Materials [Электронный ресурс]. 2011.
Режим доступа: http://qt.nokia.com/learning/education/course- materials/
Подписано в печать 03.12.12. Формат 60×84 1/16
Бумага офсетная. Уч.-изд. л. 4. Тираж 100 экз. Изд. №175
Отпечатано в типографии Издательства ПетрГУ
185910, г. Петрозаводска, пр. Ленина, 33