Obtenir le chemin d'accès à partir d'un QML url
FileDialog
donne un QML url
variable. theurl.toString()
donne quelque chose comme file:///c:\foo\bar.txt
. Comment puis-je obtenir c:\foo\bar.txt
?
Je veux le faire en une croix-plate-forme de voie, et, idéalement, sans compter sur les regex style hacks. QUrl
fournit un path()
méthode, mais je ne semble pas être en mesure d'y accéder à partir de QML.
Si vous voulez vous app sera de la croix-plate-forme de cette URL est exactement ce dont vous avez besoin. Selon
Ouais je l'ai dit je ne veux pas utiliser les regex style hacks. Je me demandais si il y avait une méthode qui me donne le chemin d'accès des données directement (il est stocké dans le QUrl objet). Et ce n'est pas pour passer pour un composant Qt.
Montrant le nom de fichier à l'utilisateur.
J'ai creusé l'intervalle Qt source. Le QML "url" type semble être soutenue par le C++ QUrl classe, qui a une très belle toLocalFile() la méthode, mais ce n'est pas un Q_INVOKABLE méthode, malheureusement.
Je pense que la suppression
RFC 3986
URL commence avec le protocole. Dans votre cas, il est file://
.Tous les composants de Qt comprendre, même pour le pire, parfois, vous obtiendrez une erreur lors de la transmission de quelque chose comme c:/bar.txt
. Si vous souhaitez obtenir cette URL dans wrong
façon dont vous voulez juste pour remplacer le protocole de partie - theurl.toString().replace("file:///","")
Ouais je l'ai dit je ne veux pas utiliser les regex style hacks. Je me demandais si il y avait une méthode qui me donne le chemin d'accès des données directement (il est stocké dans le QUrl objet). Et ce n'est pas pour passer pour un composant Qt.
Montrant le nom de fichier à l'utilisateur.
J'ai creusé l'intervalle Qt source. Le QML "url" type semble être soutenue par le C++ QUrl classe, qui a une très belle toLocalFile() la méthode, mais ce n'est pas un Q_INVOKABLE méthode, malheureusement.
Je pense que la suppression
file:///
avec 3 barres obliques est nécessaire pour Windows, mais s'arrête sur Unix.OriginalL'auteur Timmmm | 2014-07-24
Vous devez vous connecter pour publier un commentaire.
Comme indiqué dans les commentaires déjà, il semble y avoir aucun moyen (encore?) pour obtenir le chemin lui-même sans une regex. C'est donc le seul chemin à parcourir:
Solution de base
Cette expression devrait être assez robuste comme il ne supprime que les
file:///
depuis le début de la chaîne.Vous aurez aussi besoin de ne pas encoder certains caractères HTML (si le nom de fichier contient par exemple le hachage
#
, ce serait retourné comme%23
. Nous décoder en utilisant la fonction JavaScriptdecodeURIComponent()
).Complet exemple
Si non seulement vous voulez filtrer les
file:///
mais aussiqrc://
ethttp://
, vous pouvez utiliser cette RegEx:De sorte que le nouveau code complet serait:
C'est un bon terrain de jeu pour les RegEx es: http://regex101.com/r/zC1nD5/1
file://
Url.Ermm non, je suis en utilisant ce code moi-même et c' . Bien sûr qu'il fonctionne pour
file:///
Url (et pasfile://
- pour les deux ou trois barres obliques, utilisez/^(file:\/{2,3})/
). Ou tu veux dire quoi? Pour référence, voir: regex101.com/r/aO1qG4/1Je veux dire qu'il ne fonctionne pas pour d'autres projets, comme
qrc://
ouhttp://
. Je ne dis pas que ça ne marchera pas, dans de nombreux cas; il suffit de remarquer que ce n'est pas le même queQUrl::path()
.Je l'ai eu. Je suppose, vous ne voulait fichiers à partir de la boîte de dialogue de fichier. Mais vous avez raison, vous pouvez également entrer un
http://
-URL. J'ai édité ma réponse appropriée. J'espère que je n'ai couvrir tous les cas maintenant. Mais oui, bien sûr, unQUrl::path()
-comme la fonction serait l'idéal.OriginalL'auteur mozzbozz
Dans MS Windows "file:///c:\foo\bar.txt" doit être convertie en une "c:\foo\bar.txt". Cependant sous Linux l'url "fichier:///Users/data/abcdef" est le chemin d'accès correct "/Users/data/abcdef". J'ai créé une fonction simple pour convertir url path:
OriginalL'auteur Tony
Suivant Chris Dolan est la réponse ci-dessus, c'est probablement la plus fantastique de traiter avec cela à l'aide d'une fente en C++:
OriginalL'auteur Anthony Hayward