InAppTab
InAppTab — это компонент, позволяющий приложению запускать отдельную вкладку WebView как внешнее приложение, но с возможностью управлять процессом загрузки и получать соответствующие сигналы. Каждый экземпляр InAppTab создаёт собственный процесс WebView через приватный D-Bus-канал.
Для интеграции InAppTab в приложение нужно выполнить лишь три шага:
- Подключить библиотеку и зарегистрировать QML-типы.
- Добавить разрешение InAppTab в .desktop.
- Использовать компонент InAppTab в QML, подписавшись на сигналы и вызывая
open().
Компонент не требует дополнительной настройки, автоматически создаёт выделенный процесс WebView и обеспечивает чистое взаимодействие с ним в рамках приложения.
Содержание:
Подключение компонента
Ниже приведён минимальный пример интеграции компонента в приложение:
-
Подключить библиотеку InAppTab.
-
Для CMake:
В проект необходимо добавить зависимость от библиотеки:
find_package(Qt5 COMPONENTS Core Qml Gui Quick DBus REQUIRED) target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Quick Qt5::Qml Qt5::DBus inapptab ${AURORA_LDFLAGS} ) -
Для qmake не трубуется дополнительное подключение зависимостей.
-
-
Зарегистрировать QML-типы.
В
main.cppнужно зарегистрировать классы для использования в QML:qmlRegisterType<InAppTab>("ru.auroraos.InAppTab", 1, 0, "InAppTab"); // регистрация перечисления с кодами ошибок qRegisterMetaType<LoadError::LoadErrorType>("LoadError::LoadErrorType"); qmlRegisterUncreatableType<LoadError>( "ru.auroraos.InAppTab", 1, 0, "LoadError", "Enum only" );Примечание.
LoadErrorрегистрируется как Uncreatable, чтобы в QML были доступны только значения перечисления (enum). -
Добавить разрешение в .desktop.
Для работы InAppTab требуется предоставить приложению разрешение:
[X-Application] Permissions=…;InAppTab;…Без этого приложение не сможет запускать InAppTab-процессы.
Использование компонента
-
Использование InAppTab в QML.
Создание компонента:
InAppTab { id: inAppTab onLoadStart: { console.log("Начало загрузки:", url) } onLoadEnd: { console.log("Загрузка завершена:", url) } onLoadError: { if (error === LoadError.NavigationFailed) console.log("Навигация не удалась:", url) else console.log("Неизвестная ошибка:", url) } onClosed: { console.log("InAppTab закрыт") } }Доступные сигналы:
LoadStart(url)— начало загрузки страницы;LoadEnd(url)— успешное завершение;LoadError(url, error)— ошибка загрузки (в том числе процесс не запущен);Closed()— вкладка была закрыта пользователем.
-
Открытие URL.
Для открытия страницы вызывается метод:
inAppTab.open("https://google.com")Каждый вызов
open()создаёт новый WebView-процесс через приватное соединение D-Bus. -
Полный пример QML-страницы:
Page { PageHeader { title: qsTr("Запуск процессов") } Column { anchors.top: header.bottom spacing: 4 * Theme.paddingLarge Button { text: qsTr("Открыть вкладку") width: Theme.buttonWidthLarge anchors.horizontalCenter: parent.horizontalCenter onClicked: inAppTab.open("https://google.com") } } InAppTab { id: inAppTab onLoadStart: console.log("Загрузка начата:", url) onLoadEnd: console.log("Загрузка завершена:", url) onLoadError: console.log("Ошибка:", error, url) onClosed: console.log("Вкладка закрыта") } }