4. Перевод существующих приложений.
Утилитой lupdate извлекаются все строки из исходного текста приложения.
Выполняется перевод строк, с помощью утилиты Qt Linguist .
С помощью утилиты lrelease создается двоичный файл .qm с переводом, который потом может быть загружен приложением.
В качестве примера, рассмотрим процесс перевода приложения Spreadsheet, которое было написано нами в Главе 3. Оно уже содержит все необходимые вызовы tr().
Прежде всего, необходимо внести изменения в файл проекта .pro, чтобы указать — какие языки будут поддерживаться приложением. Допустим, что мы собираемся включить поддержку немецкого, французского и русского языков, дополнительно к английскому, тогда необходимо в файл spreadsheet.pro добавить раздел TRANSLATIONS:
Здесь мы указали три файла переводов: для немецкого, французского и русского языков. Эти файлы будут созданы при первом запуске утилиты lupdate, а на последующих запусках будут просто дополняться.
Обычно исходные файлы с переводом имеют расширение .ts. Они записываются в формате XML и потому занимают больше места на диске, чем скомпилированные файлы с переводом .qm. Для тех, кому это интересно — .ts означает «translation source» (исходный текст перевода), а .qm — «Qt message».
Допустим, что мы уже находимся в каталоге с исходными текстами приложения Spreadsheet. Теперь запускаем lupdate из командной строки:
Ключ -verbose — необязательный. Он просто заставляет lupdate выводить более подробную информацию в ходе своей работы. Ниже приведен примерный вывод, полученный во время работы утилиты: Каждая строка, которая «завернута» в вызов tr(), заносится в .ts, с пустым местом для перевода. Строки, которые находятся в файле .ui, так же включаются в исходный файл перевода.
По-умолчанию, lupdate предполагает, что все строки, завернутые в вызовы tr(), набраны в кодировке Latin-1. Если это не так, необходимо указать элемент CODEC в файле .pro, например так:
Это необходимо делать в дополнение к вызову QTextCodec::setCodecForTr() в приложении.
Перевод, в файлы spreadsheet_de.ts, spreadsheet_fr.ts и spreadsheet_ru.ts, добавляется переводчиком, с помощью утилиты Qt Linguist .
Чтобы запустить Qt Linguist , в среде Windows, выберите пункт Qt 3.2.x | Qt Linguist в меню Пуск, в среде Unix — наберите команду linguist. Затем, с помощью меню File|Open, откройте файл с исходным текстом перевода.
С левой стороны главного окна Qt Linguist находится список контекстов переводов. Для Spreadsheet существуют следующие контексты: «FindDialog», «GoToCellDialog», «MainWindow», «SortDialog» и «Spreadsheet». В верхней части с правой стороны находится список строк для текущего контекста. Каждая строка отображается вместе с переводом и флагом Done («Готово»). В средней области, с правой стороны, вводится текст перевода для текущей строки. И внизу находится список переводов, автоматически предлагаемых утилитой Qt Linguist .
По окончании работы над переводом, файл .ts необходимо преобразовать в файл .qm. Для этого, в приложении Qt Linguist выберите пункт меню File|Release. Обычно, после перевода нескольких строк, выполняются пробные запуски приложения, с созданным файлом .qm, чтобы визуально оценить качество перевода.
Рисунок 15.2. Qt Linguist в действии.
Чтобы перегенерировать все файлы .qm сразу, необходимо запустить утилиту командной строки lrelease: Предположим, что мы сделали перевод на русский язык 19-ти строк, причем установили признак Done для 17-ти из них. В этом случае мы получим от lrelease примерно такой вывод: Непереведенные строки, при пробном запуске приложения, будут отображаться на языке оригинала. Флаг Done никак не используется утилитой lrelease, он предназначен исключительно для переводчика, чтобы напоминать о том, какие строки имеют окончательный перевод, а какие требуют уточнения.
В случае внесения изменений в исходный код приложения, содержимое файлов .ts может «устареть». Чтобы этого не происходило нужно всякий раз запускать утилиту lupdate, добавлять перевод для вновь появляющихся строк и пересобирать файлы .qm. Некоторые команды разработчиков синхронизируют перевод так часто, насколько это только возможно, другие предпочитают дождаться окончательного релиза приложения и только тогда приступают к переводу.
Утилиты lupdate и Qt Linguist достаточно «умны». Переведенные строки, необходимость в которых уже отпала, все равно сохраняются в исходных файлах с переводами, на тот случай, если они могут понадобиться в будущем. При обновлении файлов .ts, утилита lupdate использует интеллектуальный алгоритм объединения, который помогает избежать лишней работы по переводу одинаковых строк в различных контекстах.
c++ — пример — запуск qt приложения на другом компьютере
По прошествии нескольких часов работы в Qt Forums я узнал, что мне нужно скопировать папку «qml» (обычно находящуюся в C: /Qt/5.2.1/qml) в корневой каталог приложения. После этого динамические и статические версии моего приложения работали на ванильных системах.
Каталог программ (MinGW 4.8 32-бит, динамический):
Как сказал , используйте инструмент windeployqt ( \binwindeployqt.exe ), чтобы скопировать файлы nescesary в папку вашего приложения. После этого скопируйте необходимые компоненты QML из \qml в папку вашего приложения. Полученная папка должна выглядеть примерно так:
- платформы (папка)
- QtQuick (папка)
- QtQuick.2 (папка)
- Любые другие компоненты QML, которые вам нужны
- app.exe
- icudt51.dll
- icuin51.dll
- icuuc51.dll
- libgcc_s_dw2-1.dll
- libstdc ++ — 6.dll
- libwindthread-1.dll
- Qt5Core.dll
- Qt5Gui.dll
- Qt5Qml.dll
- Qt5Quick.dll
- Qt5Network.dll
- Qt5Widgets.dll
Каталог программ (статический)
Скомпилируйте приложение статически, затем скопируйте необходимые компоненты QML из \qml в папку вашего приложения. Полученная папка должна выглядеть примерно так:
- QtQuick (папка)
- QtQuick.2 (папка)
- Любые другие компоненты QML, которые вам нужны
- app.exe
Я считаю, что причиной сбоя было то, что Qt5Gui.dll (динамический и статический) «пытался» загружать папки QtQuick * во время выполнения, но не смог их найти (таким образом, сбой приложения во время загрузки).
Я написал несколько приложений в QML (часть Qt 5). В вопросе, который я сделал ранее ( https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x ), я нашел решение для развертывания моего приложения OS X (с помощью инструмента macdeployqt).
Развертывание приложений Qt4 в Windows было легко:
- Вы скомпилировали его в режиме выпуска.
- Вы скопировали необходимые библиотеки (DLL).
- Вы протестировали, и это сработало.
К сожалению, этот подход не работал в Qt5 (я даже включил папку платформ с файлом qwindows.dll, и это не сработало). После нескольких дней попыток я сдался и составил статическую версию Qt5.
Опять же, это не сработало. Приложение работает на ПК с установленной Qt, но он падает на «чистых» ПК. В качестве примечания, системы Windows 8 / 8.1 не дают предупреждения или сообщения, уведомляющего меня об аварии приложения. Но в Windows 7 сообщение уведомляет меня о том, что приложение разбилось.
Я попытался запустить Dependency Walker (depend.exe), и все библиотеки в статической сборке моего приложения выглядели прекрасно.
В Windows 8 я не получаю никаких ошибок. Но после профилирования приложения в файле зависит .exe, я получаю нарушение доступа, происходящее из QtGui.dll. Точная ошибка
Второе случайное исключение 0xC0000005 (Нарушение доступа) произошло в «QT5GUI.DLL» по адресу 0x61C2C000.
Есть что-то, что мне не хватает (скажем, дополнительный DLL или файл конфигурации)?
Информация о приложении:
- Написано и скомпилировано с Qt 5.2.1
- Использует Quick / QML.
- Использует сетевой модуль.
- Использует модуль webkit.
- Использует модуль bluetooth.
- Файлы QML написаны в Quick 2.2
Начиная с Qt 5.2, есть инструмент windeployqt который вы можете использовать. Просто запустите его из командной строки, чтобы получить справку. Но основное использование — дать ему файл .exe, он скопирует зависимости Qt, чтобы пойти с ним.
Вы захотите использовать опцию —qmldir чтобы инструмент знал, где находятся ваши файлы QML, поэтому он может определить необходимые зависимости QML.
Обратите внимание на тестирование: чтобы убедиться, что у вас есть все, протестируйте компьютер без Qt SDK или временно переименуйте каталог Qt. В противном случае приложение может найти отсутствующие файлы .
Добавляем обработчик нажатия на кнопку
Теперь давайте добавим реакцию на клик кнопки “Включить синий” для этого кликаем на нее правой кнопкой мыши и выбираем “Перейти к слоту”
в Qt используется так называемый механизм сигналов (signal) и слотов (slot) это расширений C++, которое позволяет связывать событие с реакцией на событие более-менее естественный образом.
В общем открывается такое окно где виден список сигналов, которые может послать кнопка. Например, когда вы просто нажали на кнопку, но еще не отпустили кнопку мышь, генерируется сигнал pressed, а если же вы отпустил мышь, то сгенерируется сигнал clicked.
Короче суть в том, что мы к этому сигнал сейчас привяжем функцию (или если мыслить в рамках Qt – слот)
выбираем clicked и жмем OK:
нас кидает в редактор кода
не будем мудрствовать и для начала давайте просто выведем какое-нибудь сообщение, правим функцию
скорее всего вы увидите, что QMessageBox подчеркнуто и выдается ошибка:
это потому что мы не подключим заголовочный файл с этим классом, ставим курсор на QMessageBox и жмем Alt+Enter
и видим, как вверху добавился необходимый include
теперь давайте запустим приложение и проверим что кнопка действительно заработала.
Жмем Ctrl+R и кликаем на кнопку
Настройка проектов
Необходимо в qt-creator создать новый профиль и связать его с файлом
Во все создаваемые проекты (.pro) необходимо добавить строку
После построения исполняемого файла он должен иметь размер в несколько мегабайт или даже больше (я получил 13-15 МБт), но зато он может быть запущен на компьютере, где QT не установлена.