Qt запуск приложения на другом компьютере

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 было легко:

  1. Вы скомпилировали его в режиме выпуска.
  2. Вы скопировали необходимые библиотеки (DLL).
  3. Вы протестировали, и это сработало.

К сожалению, этот подход не работал в 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. В противном случае приложение может найти отсутствующие файлы .

Добавляем обработчик нажатия на кнопку

Теперь давайте добавим реакцию на клик кнопки “Включить синий” для этого кликаем на нее правой кнопкой мыши и выбираем “Перейти к слоту”

scheme01.png

в Qt используется так называемый механизм сигналов (signal) и слотов (slot) это расширений C++, которое позволяет связывать событие с реакцией на событие более-менее естественный образом.

В общем открывается такое окно где виден список сигналов, которые может послать кнопка. Например, когда вы просто нажали на кнопку, но еще не отпустили кнопку мышь, генерируется сигнал pressed, а если же вы отпустил мышь, то сгенерируется сигнал clicked.

Короче суть в том, что мы к этому сигнал сейчас привяжем функцию (или если мыслить в рамках Qt – слот)

выбираем clicked и жмем OK:

scheme01.png

нас кидает в редактор кода

не будем мудрствовать и для начала давайте просто выведем какое-нибудь сообщение, правим функцию

скорее всего вы увидите, что QMessageBox подчеркнуто и выдается ошибка:

scheme01.png

это потому что мы не подключим заголовочный файл с этим классом, ставим курсор на QMessageBox и жмем Alt+Enter

и видим, как вверху добавился необходимый include

теперь давайте запустим приложение и проверим что кнопка действительно заработала.

Жмем Ctrl+R и кликаем на кнопку

Настройка проектов

Необходимо в qt-creator создать новый профиль и связать его с файлом

Во все создаваемые проекты (.pro) необходимо добавить строку

После построения исполняемого файла он должен иметь размер в несколько мегабайт или даже больше (я получил 13-15 МБт), но зато он может быть запущен на компьютере, где QT не установлена.

Оцените статью
Fobosworld.ru
Добавить комментарий

Adblock
detector