2015-07-22 6 views
2

Dans mon application, je génère un fichier HTML que je veux ouvrir en cliquant sur un bouton. Donc, mon fichier est nommé, par exemple:Comment utiliser QDesktopServices :: openUrl avec l'URL 'file:' contenant '#'?

QString file = "F:/the_path/to_the_/generated_html_file.html"; 

Sous Windows je changer à:

file = "file:///F:/the_path/to_the_/generated_html_file.html"; 

pour que je puisse l'ouvrir avec:

QDesktopServices::openUrl(QUrl(file)); 

et ouvre en le navigateur par défaut.

Mais lorsque le caractère # est présent dans le chemin ou le nom de fichier, il ne fonctionne plus et il semble que l'URL soit tronquée juste après le #.

Par exemple, si je le nom du fichier generated#_html_file.html, je reçois ce message d'erreur:

ShellExecute 'F:/the_path/to_the_/generated' failed (error 2). 

Pourquoi est-ce que cela se produise, et comment puis-je éviter?

Répondre

8

Dans une URL, # est un caractère qui délimite l''identificateur de fragment' à partir de l'emplacement de la ressource. Pour référencer une URL file: avec un littéral #, il doit être échappé (comme %23).

Référence: RFC 1738:

Le caractère « # » est dangereux et doit toujours être codé car il est utilisé dans World Wide Web et dans d'autres systèmes pour délimiter une URL d'un fragment /identifiant d'ancre qui pourrait le suivre.

Comme l'a noté SteveTJS, la méthode statique QUrl::fromLocalFile() est prévu à cet effet, de sorte que vous pouvez écrire

QDesktopServices::openUrl(QUrl::fromLocalFile(file)); 

au lieu de

QDesktopServices::openUrl(QUrl(file)); 

Ce sera

  1. Ajouter le file: identifiant de protocole et le nom d'hôte // vide
  2. Convertir séparateur de chemin natif à / (si différente)
  3. Encode tous les caractères non sûrs pour l'URL.
+0

En effet, j'ai posté ma réponse en même temps. La fonction QUrl :: fromLocalFile (...) fait le travail. – SteveTJS

+0

@Steve - tout à fait raison, je n'utilise pas beaucoup 'QUrl', donc j'avais oublié ça. J'ai upvoted votre réponse, et ajouterai une note à la mienne. –

4

Je viens de trouver la solution:

QString file = "F:/the_path/to_the_/generated#_html_file.html"; 
QUrl url = QUrl::fromLocalFile(file); 
// gives url="file:///F:/the_path/to_the_/generated%23_html_file.html"; 
QDesktopServices::openUrl(url); //works 
+0

Ah oui - 'fromLocalFile()' est là pour exactement ce genre de conversion. Pas besoin de la copie de 'QUrl (url)', cependant? –

+0

@TobySpeight Pas besoin de QUrl (url) car le paramètre url est déjà bon. – SteveTJS