Qt для WinRT
Qt для WinRT позволяет запускать приложения Qt на устройствах, поддерживающих API приложений Магазина Windows. Это включает современные пользовательские интерфейсы на Windows 10, Windows 10 Mobile и Windows 10 IoT.
Microsoft представил новую парадигму дизайна с современным пользовательским интерфейсом Windows 8. Основной частью этого нового подхода является Windows Runtime (WinRT), поддерживающий разработку с использованием различных языков программирования, таких как C++/CX (расширения компонентов), C#, VB.NET или JavaScript. Модуль Qt использует возможности C++. Хотя WinRT поддерживает расширения компонентов внутри, они не используются внутри Qt, и вам не нужно их использовать. Приложения WinRT выполняются в защищенной среде по соображениям безопасности и поддерживают различные архитектуры, такие как ARM и x86.
Поддерживаемые конфигурации
Поддерживаются следующие конфигурации.
| Версия платформы | Архитектура | Компилятор | Среда разработки |
|---|---|---|---|
| Универсальная платформа Windows 10 |
x86, x86_64, и armv7
|
MSVC 2017, MSVC 2015 | Windows 10 (1809) Обновление от октября 2018 года |
Универсальные платформы Windows включают Windows 10, устройства Windows 10 IoT, Xbox One и HoloLens.
Требования
Разработка для Windows Runtime требует хост-систему разработки Microsoft Windows. Минимальная поддерживаемая версия — Windows 10.
В зависимости от целевого устройства вам потребуется установить следующие инструменты, предоставляемые Microsoft:
| Целевое устройство | Среда |
|---|---|
| Windows 10 Mobile | Visual Studio 2015 |
| Рабочий стол Windows 10 | Visual Studio 2015 |
| Windows 10 IoT | Visual Studio 2015 |
| XBox One | Visual Studio 2015 |
Если вы нацеливаетесь на удаленное устройство, следуйте всем инструкциям Visual Studio для его правильной настройки.
Начало работы
Примечания для пользователей рабочего стола
Поскольку приложения WinRT выполняются в защищенной среде, при переносе или написании кроссплатформенных приложений следует учитывать некоторые ограничения:
- Класс QProcess не реализован (что указывается определением макроса
QT_NO_PROCESS), так как запуск дочерних процессов невозможен. - Некоторые пути, возвращаемые QStandardPaths::writableLocation(), могут быть пустыми.
- Приложение WinRT не может осуществлять обмен данными через сокеты с другим приложением, работающим на том же хосте (так как это нарушило бы принципы изоляции).
- Приложения запускаются только в полноэкранном режиме (см. QStyleHints). На рабочем столе размер экрана меняется при изменении размеров приложения.
- Переменные среды отсутствуют. Qt эмулирует эту функциональность, сохраняя значения локально, так что qputenv() и связанные функции продолжают работать. Все известные переменные, влияющие на Qt, можно задать в исходном коде.
- Приложения WinRT по своей природе являются приложениями с пользовательским интерфейсом. Это означает, что приложения типа консоли будут иметь созданный внутри окно, которое всегда отображается.
- Приложения не должны завершаться программно. В частности, вызов exit() до отображения пользовательского интерфейса приводит к сбою.
- Буфер обмена WinRT локален для приложения; его не может получить приложение рабочего стола.
Создание приложений
Вы можете разрабатывать приложения для WinRT так же, как и другие приложения Qt. Используйте свой любимый редактор или IDE (такой как Qt Creator) и создайте свое приложение или загрузите пример Qt. Затем запустите qmake и nmake/jom для компиляции вашего приложения.
Создание приложений с помощью Visual Studio
Для запуска проекта с помощью Visual Studio необходимо создать соответствующий проект. qmake поддерживает преобразование проекта .pro в формат Visual Studio, передавая параметры -tp vc.
qmake -tp vc <your project>.pro
Следите за использованием правильного соответствия qmake и Visual Studio. Поскольку формат Visual Studio является общим, он не возвращает немедленной ошибки, если, например, вы откроете проект Windows Phone в Visual Studio для Windows.
Это создает проект, который поддерживает компиляцию и запуск приложений с Visual Studio. Он не встраивает библиотеки Qt в пакет и требует от вас их добавления вручную. Для этого в установленный пакет включена командная утилита windeployqt. Чтобы включить автоматическое определение зависимостей и добавление библиотек и зависимостей в пакет приложения, создайте проект с помощью следующих параметров:
qmake -tp vc <your project>.pro "CONFIG+=windeployqt"
Создание приложений с помощью Qt Creator
Вам не нужно производить никаких преобразований, чтобы открыть свой проект в Qt Creator. Следуйте общим инструкциям по открытию и компиляции проекта.
Qt Creator развертывает ваше приложение на устройстве WinRT, если устройство распознается компьютером.
Примечание: Удаленные компьютеры, такие как Surface, пока не поддерживаются для развертывания Creator.
Компиляция из исходного кода
Мы предполагаем, что вы клонировали репозитории Qt 5 (или получили исходные коды Qt где-то ещё) и выполнили требования к компиляции Qt, не зависящие от платформы. Процесс компиляции Qt описан на странице Компиляция исходных кодов Qt.
Qt для WinRT всегда компилируется как кросс-компиляция, потому что такие инструменты, как qmake, создаются как приложения для рабочего стола. Для их компиляции требуется среда разработки для рабочего стола. Если вы установили Visual Studio 2013 для Windows, это создаст только исполняемые файлы для WinRT. Для создания инструментов для рабочего стола вам также потребуется Visual Studio для рабочего стола Windows.
Для каждой компиляции WinRT убедитесь, что вы используете командную строку x86 (используйте VS x86 Native Tools Command Prompt или вызовите vcvarsall.bat без параметров или с x86). Хотя целевая цепочка инструментов устанавливается автоматически, командная строка определяет, какие инструменты, такие как qmake или moc, будут использованы для хоста. Компиляция этих инструментов может завершиться ошибкой, если используется другая командная строка.
Формат mkspec WinRT — <platform>-<architecture>-<toolchain>, где архитектура может быть arm, x86, или x64. Вот пример компиляции qtbase для WinRT:
> ./configure -xplatform winrt-x64-msvc2013 -release > nmake/jom
Запуск приложений из командной строки
Приложения WinRT должны быть упакованы (включая все зависимости) и установлены или зарегистрированы в службе приложений, чтобы их можно было запустить. Инструмент WinRT Runner может использоваться для запуска этих приложений из командной строки.
Содержимое пакета
Содержимое пакета включает исполняемый файл приложения и его зависимости, как и для любого приложения Windows. Зависимости — это необходимые (библиотеки Qt) и плагины. Обратите внимание, что плагины Qt должны быть помещены в папку, соответствующую их категории (платформы, форматы изображений и т. д.), без использования папки plugins в качестве корневой. Более подробную информацию см. в разделе Qt для Windows — Развертывание.
Поскольку приложения WinRT выполняются в защищенной среде, установка переменной пути для указания файлов, необходимых для работы, не сработает.
Удобная утилита windeployqt находит зависимости приложения и копирует библиотеки и плагины Qt в соответствующие каталоги по мере необходимости.
Поскольку все ресурсы размещаются в одном каталоге, вы можете зарегистрировать каталог с помощью XML-файла (AppxManifest.xml) и Windows PowerShell. Справочник по этим файлам манифестов можно найти здесь. Необходимо указать архитектуру целевого процессора (в отличие от значения по умолчанию «нейтральный»). После выполнения этих требований перейдите в папку packaged в PowerShell и выполните:
> Add-AppxPackage -Register AppxManifest.xml
Примечание: Инструмент WinRT Runner может выполнить ту же операцию с параметром --install.
Если все прошло успешно, вы должны найти свое приложение на начальном экране Windows. Для удаления приложения используйте встроенный способ удаления приложений Windows (щелкните правой кнопкой мыши или удерживайте палец на приложении и выберите Uninstall).
Примечание: Инструмент WinRT Runner может выполнить ту же операцию с параметром --remove.
Инструмент WinRT Runner
Инструмент WinRT Runner можно найти в QTDIR/bin/winrtrunner. Он предназначен для помощи в развертывании, запуске и отладке приложений Qt для WinRT. Он может использоваться из командной строки или вызываться из IDE.
Usage: winrtrunner [options] package [arguments]
winrtrunner installs, runs, and collects test results for packages made with Qt.
Options:
--test Install, start, collect output, stop (if
needed), and uninstall the package. This is
the default action of winrtrunner.
--start Start the package. The package is installed
if it is not already installed. Pass
--install to force reinstallation.
--debug <debugger> Start the package with the debugger
attached. The package is installed if it is
not already installed. Pass --install to
force reinstallation.
--debugger-arguments <arguments> Arguments that are passed to the debugger
when --debug is used. If no debugger was
provided this option is ignored.
--suspend Suspend a running package. When combined
with --stop or --test, the app will be
suspended before being terminated.
--stop Terminate a running package. Can be be
combined with --start and --suspend.
--wait <seconds> If the package is running, waits the given
number of seconds before continuing to the
next task. Passing 0 causes the runner to
wait indefinitely.
--install (Re)installs the package.
--remove Uninstalls the package.
--device <name|index> Specifies the device to target as a device
name or index. Use --list-devices to find
available devices. The default device is the
first device found for the active run
profile.
--profile <name> Force a particular run profile.
--list-devices List the available devices (for use with
--device).
--verbose <level> The verbosity level of the message output
(0 - silent, 1 - info, 2 - debug). Defaults
to 1.
--ignore-errors Always exit with code 0, regardless of the
error state.
--loopbackexempt <mode> Enables localhost communication for
clients,servers or both. Adding this
possibility for servers needs elevated
rights and might ask for these in a
dialog.Possible values: client, server,
clientserver
-?, -h, --help Displays this help.
Arguments:
package [arguments] The executable or package manifest to act
upon. Arguments after the package name will
be passed to the application when it starts.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/winrt-support.html